Top > Blog > 2011-02-17
Last-modified: Fri, 18 Feb 2011 01:42:35 JST

ワイルドカードでマッチング

PHPにはワイルドカードでの文字列のマッチング用にfnmatch()という関数が用意されてて、PHP5.3からはWindowsでもOKとマニュアルに書いてある。

が、しばらく試したけど上手く動いてくれない。マルチバイトの文字列がダメかと思ったけど、ASCII文字列だけでも動かない。なぜ? 環境はWindows VistaにXAMPP1.7.3。

仕方ないので、とりあえずは下記のページと同じような方向で(2つ目のリンクの内容は正確さがイマイチか?)、ワイルドカードを正規表現に変換してpreg_match()に流し込むことになする。

用は、ワイルドカードで意味のあるものを正規表現に変換(例えば?→.)、逆に正規表現で使用される特殊文字はエスケープする(例えば$→\$)。それだけ。

ただし、?→.→\.みたいな、余計な変換が起こったりしないように細かい配慮は必要。3番目のリンクの内容の、まずpreg_quote()で全部エスケープして、必要な分だけ、エスケープした文字丸ごと変換するのがいいかな。

何にしてもfnmatch()が動かないのが気持ち悪いなー。まぁ、PHP5.3じゃなくても動くようにできるから、よしとするか。


おまけで、マニュアルのpreg_quote()を見ると、正規表現の特殊文字は

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

だ。簡単でいいなら、今回の話は

$str= str_replace(array('\?','\*'), array('.', '.*?'), preg_quote($str));

くらいでいいか。




コメント

適当に書いて頂いて構いません。スパム対策があるので、書き込めない場合があります。また、ボタンを押した後にしばらく時間がかかります。

新規コメント(ラジオボタンで親コメント選択可)
お名前

現在、コメントはありません