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. まで戻って次のテストをするはずがそれが行われない。

カテゴリーPHP

“PHPの正規表現” への1件の返信

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です