人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PerlもしくはPHPの正規表現で

キーワード「あいうえお」を入力したとき
長い文字列のなかから、
「あいxえお」
「あいうえe」
「あ●うえお」
など
このように1文字違っていても
抽出するようにしたいんですが可能でしょうか?
可能であればソースプログラムを教えて下さい。

●質問者: tembin11
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Perl PHP あい あいうえお キーワード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● GEN111
●28ポイント ベストアンサー

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: preg_match_all - Manual

◎質問者からの返答

動きました。

素晴らしいですね。有難うございます。


2 ● tezcello
●27ポイント

泥臭い方法ですけど、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かならこちらのほうが処理速度が

早いですね


3 ● b-wind
●25ポイント

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";
}

Perl の演算子と優先順位


まぁまぁかな。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ