タグ: 正規表現 を抽出しています。
Total: 8

住所文字列の分解

ブログ | 2010/8/6 01:27
区切りのない住所文字列から、
都道府県と市区町村とその他に分けます。

<?php

$str = '石川県石川郡野々市町住吉町';
//$str = '長崎県北松浦郡鹿町町鹿町免';
//$str = '三重県四日市市高砂町';
//$str = '広島県廿日市市須賀';
//$str = '岩手県花巻市東和町落合1区';
//$str = '新潟県上越市中郷区江口';
//$str = '北海道旭川市四区三条四丁目';

preg_match('/^(北海道|青森県|岩手県|秋田県|山形県|宮城県|福島県|新潟県|栃木県|群馬県|茨城県|埼玉県|千葉県|東京都|神奈川県|山梨県|静岡県|長野県|富山県|石川県|福井県|岐阜県|愛知県|三重県|奈良県|和歌山県|滋賀県|京都府|大阪府|兵庫県|岡山県|広島県|鳥取県|島根県|山口県|香川県|徳島県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県)(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

$pref = !empty($match[1]) ? $match[1] : '';
$city = !empty($match[2]) ? $match[2] : '';
$town = !empty($match[3]) ? $match[3] : '';

?>

Yahoo!のAPIが区切りを入れてくれると嬉しいのだけれど...
▼追記 2010/8/28 05:47
townに区が入ると切れなかったので、少し修正。
まだ網羅はできてない気はします。
▼追記 2010/8/28 16:15
都道府県も省略して、これでいけるかな。
preg_match('/^(.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

都・道・府・県の文字列の入る都道府県はないですよね?
▼追記 2010/8/28 16:23
もう少し短くできるか
preg_match('/^(.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/29 18:23
京都府が失敗してたので追加。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/31 12:21
一文字区がまずかったので、更に修正。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/31 21:19
省略で失敗(「羽村市」にて)したので、少し長く戻しました。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 00:42
フィードバックから、大和郡山市,杵島郡大町町,周南市 を追加。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|北松浦郡鹿町町|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|周南市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 01:28
フィードバックから、「区」コレクション
http://uub.jp/nam/ku.html

これで、イイ線いったんじゃなかろうか。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|北松浦郡鹿町町|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 11:44
masaさん情報から、西海市を追加かな。
北松浦郡鹿町町は、佐世保市に合併とのことなので、いずれ消去。
▼追記 2010/9/1 22:54
これでどうじゃ!
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|西海市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

穴を見つけた方には、2pt差し上げます。
▼追記 2010/9/1 23:11
こうしようかと思うのですが、ご意見募集中。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|(大阪市|名古屋市|京都市|横浜市|神戸市|北九州市|札幌市|川崎市|福岡市|広島市|仙台市|千葉市|さいたま市).+?区|(千代田|中央|港|新宿|文京|台東|墨田|江東|品川|目黒|大田|世田谷|渋谷|中野|杉並|豊島|北|荒川|板橋|練馬|足立|葛飾|江戸川)区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

$pref = !empty($match[1]) ? $match[1] : '';
$city = !empty($match[2]) ? $match[2] : '';
$town = !empty($match[5]) ? $match[5] : '';

PHP、検索文字列のみハイライト(タグ内を除外)

ブログ | 2010/7/29 21:54
$strの文章の中、$wをem挟みます。HTMLタグ内は除外。
function f_src($str,$w){
 if(!empty($w)){
   $w = preg_quote($w);
   $w = strtr($w,array('/'=>'/'));
   $str = preg_replace_callback('/(<[^>]*'.$w.'[^<]*?>)|('.$w.')/iu',
     create_function(
       '$match',
       'if($match[1]){
         return $match[1];
       }elseif($match[2]){
         return "<em>".$match[2]."</em>";
       }'
     ),
     $str);
 }
 return $str;
}

正規表現でエンコードされたURLをデコードする。

ブログ | 2009/7/7 00:17
FirefoxでwikipediaのURLをコピペすると日本語がエンコードされている。そういったURLがペーストされた時、それらを正規表現でデコードするのである。

function f_urldecode($str){
 return preg_replace_callback('/(https?:\/\/[a-zA-Z0-9_\(\)\.\/\~\%\:\#\?=&\;\-\+\,]+)/iu',
 create_function(
   '$matches','return urldecode($matches[0]);'
 ),
 $str);
}

URL関係は、エンコードしたり、デコードしたり忙しい。

PHP正規表現 パターン演算子u

ブログ | 2009/5/9 21:38
ダニエル・カールが化けるので調べてみた。
preg_replace_callbackで化けていた。

URLの変換は、
$str = preg_replace_callback('/(<a [^>]+?>.+?</a>)|(https?://[^ ^\r\n^<^)^)^ ]+)/i', array($this,'url'), $str);
こんな感じにしていたのだけれど、正規表現内の「^)」「^ 」で化けていたようだ。
で、検索していたら、PHPの正規表現には、UTF-8用の「u」というパターン演算子があるとのこと。
http://jp2.php.net/manual/ja/reference.pcre.patt...

で、uをつけて解決。
$str = preg_replace_callback('/(<a [^>]+?>.+?</a>)|(https?://[^ ^\r\n^<^)^)^ ]+)/iu', array($this,'url'), $str);

▼追記 2009/5/9 21:49
ん、パターン修飾子って言うのか。

URLの判別

ブログ | 2008/2/21 03:36
$str = preg_replace_callback('/(<a [^>]+?>.+?<\/a>)|(https?:\/\/[^ ^ ^\r\n^<^)^)]+)/i', array($this,'url'), $str);

同じクラス内の function url($str){} で処理。

これでいってみよう。
wikipediaで「)」が入ってるURLを見たことがある気がするけど。
前 | 1 | 2 |

Rottel内コンテンツ

アーカイブ
コメント
ツイッカー
アンケート
デイリーRottel
ブログ
写真
フィードバック
ブックマーク
マップ
タグ
手当たり次第

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close