キーワード「あいうえお」を入力したとき
長い文字列のなかから、
「あいxえお」
「あいうえe」
「あ●うえお」
など
このように1文字違っていても
抽出するようにしたいんですが可能でしょうか?
可能であればソースプログラムを教えて下さい。
PHPで。
もっとイカしたやり方がありそうな気もしますが。
function nealy_match($pat, $target) { $pchars = preg_split('/(?<!^)(?!$)/u', $pat) ; $newpat = array() ; for ($i = 0, $tmp = array(); $i < count($pchars); ++$i) { $tmp = $pchars ; $tmp[$i] = '.' ; $newpat[] = implode('', $tmp) ; } preg_match_all('/('.implode('|', $newpat).')/u', $target, $matches) ; return $matches[0] ; } $str = '吾輩は猫である。あいxえお。名前はまだ無い。あいうえe。どこで生れたかとんとあ●うえおがつかぬ。'; $pat = 'あいうえお' ; print_r(nealy_match($pat, $str)) ;
PHPで。
もっとイカしたやり方がありそうな気もしますが。
function nealy_match($pat, $target) { $pchars = preg_split('/(?<!^)(?!$)/u', $pat) ; $newpat = array() ; for ($i = 0, $tmp = array(); $i < count($pchars); ++$i) { $tmp = $pchars ; $tmp[$i] = '.' ; $newpat[] = implode('', $tmp) ; } preg_match_all('/('.implode('|', $newpat).')/u', $target, $matches) ; return $matches[0] ; } $str = '吾輩は猫である。あいxえお。名前はまだ無い。あいうえe。どこで生れたかとんとあ●うえおがつかぬ。'; $pat = 'あいうえお' ; print_r(nealy_match($pat, $str)) ;
動きました。
素晴らしいですね。有難うございます。
泥臭い方法ですけど、1文字違いなら全部書いてしまった方が単純でしょう。
キーワードの1文字づつをピリオドにかえてパイプで連結します。
最後のパイプは不要なので、削除し、全体をかっこで閉じて、検索文字列を作ります。(記述している順序は違いますが)
後はmb_ereg() で検索します。
http://www.php.net/manual/ja/function.mb-ereg.php
$ary = array( 'い○●にあいxえおながいもじれつ' ,'長い文字列あいうえeろはにほへと' ,'もじもじもじあ●うえおいrはに' ,'いろはおあいUEおもじもじ' ); $key = 'あいうえお'; $length = mb_strlen($key); $pattern = '('; for ($i=0; $i<$length; $i++){ $chr = '/'.mb_substr($key, $i, 1).'/'; $pattern .= preg_replace($chr, '.', $key).'|'; } $pattern =preg_replace('/\.\|/', '.)', $pattern); foreach($ary as $str){ $res = mb_ereg($pattern, $str); if ($res) print "$str is match!<br>\n"; }
有難うございます。
OKかNGかならこちらのほうが処理速度が
早いですね
perl で文字コードは sjis に。
#!/usr/bin/perl use encoding sjis; my $regex = '(?:(あ)|.)(?:(い)|.)(?:(う)|.)(?:(え)|.)(?:(お)|.)'; my @str = qw/ あいxえお あいうえe あ●うえお あかさたな /; foreach my $str ( @str ) { my @match = $str =~ m/$regex/; my @count = grep { defined $_ } @match; printf "string: %s is %s\n" , $str, @count >= 4 ? "match" : "unmatch"; }
まぁまぁかな。
動きました。
素晴らしいですね。有難うございます。