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