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

検索インデックスで省く文字

ブログ | 2012/2/12 17:14
3文字までの、ngramのインデックスも大きくなると、なかなか大変。
なので、少しでも文字を少なくして容量を削減したい。で、記号系はできるだけスルーする。

ngramの文字列配列を返す関数。
function ngramIndex($str,$wlen=3){
 $len = mb_strlen($str);
 $n = array();
 for($i=0; $i < $len; $i++){
   for($a=1; $a <= $wlen; $a++){
     $moji = mb_substr($str,$i,$a);
     if(preg_match('/[\r\n !"#$%()*+,-.:;<=>?¥ 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#*@§☆★○●◎◇◆□■△▲▽▼※→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪]/u',$moji)) continue;
     if($a == 1 && preg_match('/[ぁ-ゞァ-ヾ!-~0-9ー&〒]/u',$moji)) continue;
     $n[] = $moji;
   }
 }
 $n = array_unique($n);
 return $n;
}

スルーしてない記号は、固有名詞に出てきそうな、「'」「&」「@」「/」「&」「ー」「〒」。
「。」はスルーする。「モーニング娘。」は無視する。

これでいいか。

住所文字列の分解

ブログ | 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] : '';
▼追記 2011/1/21 15:38
これのフィードバックやらねばだな。
今夜やろう。
▼追記 2011/2/8 23:24
現在のかたち(なぜか、ここからはjavascriptで)
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|山口市|鹿児島市|鈴鹿市|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|西海市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);
var a = {};
a.pref = m[1] || '';
a.city = m[2] || '';
a.town = m[3] || '';
a.numb = m[4] || '';
▼追記 2011/2/9 00:11
懲りずに。
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|(?:[^市]*?|余市|高市)郡.+?[町村]|(?:石狩|伊達|八戸|盛岡|奥州|南相馬|上越|姫路|宇陀|黒部|小諸|富山|岩国|周南|佐伯|西海)市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);
▼追記 2012/5/8 00:48
フィードバックいただいたので、追加。
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|郡上市|杵島郡大町町|佐波郡玉村町|(?:[^市]*?|余市|高市)郡.+?[町村]|(?:石狩|伊達|八戸|盛岡|奥州|南相馬|上越|姫路|宇陀|黒部|小諸|富山|岩国|周南|佐伯|西海)市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);

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とは?
利用規約
開発飲料
利用者の声
ヘルプ
close