« Internet ExplorerでOffice文章などが開けない問題 | メイン | Javaで日本語をUnicode処理する »

PHPの正規表現

PHPの正規表現

マルチバイト正規表現が弱い
mb_ereg('[ア-ン]', $str)
で半角カナが含まれているかどうかはチェックできても
mb_ereg('^[ぁ-んー\]+$', $str)
で全角かなだけで構成されているかどうかはチェックできない。
mb_ereg('^[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょー\]+$', $str)
としなければいけない

メールアドレスマッチングの謎
preg_match('/^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)+[0-9a-z]{2,}$/i', $str)
はメールアドレスとマッチしなが、
preg_match('/^[.0-9a-z_+-]+@(?:[0-9a-z-]+?\.)+[0-9a-z]{2,}$/i', $str)
はメールアドレスとマッチする。

グループ化した後に量子指定子がくると aaa@bbb.com の場合
^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)
でaaa@bbb. までマッチングされるが
^[.0-9a-z_+-]+@(?:[0-9a-z-]+\.)+
となると[0-9a-z-]+が欲張ってしまい、最後までマッチングを試みた後、バックトラックして aaa@bbb. まで戻って次のテストをするはずがそれが行われない。



トラックバック

トラックバックは本サイトの紹介(リンクがあれば可)があるものに限り受付いたします。このエントリーのトラックバックURLは以下のとおりです。

http://blog.development-network.net/mt/mt-tb.cgi/685

コメント

ひらがなの正規表現は、mb_ereg('^([あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょー  ]+', $kana)で行けそうだが、UTF-8に限った話なのかうまくいかない。
mb_ereg('^([あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょー]| | )+$', $kana)であればうまくいったので、追記しておきます。
ちなみに、mb_eregを使う際には、mb_regex_encoding関数で予めエンコードを指定しておいたほうが安全。

コメントを投稿