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