【php】正規表現
【概要】
PHPには正規表現関数群が3種類ある。
PHPには正規表現関数群が3種類ある。
- 標準正規表現関数(POSIX Regex):ereg()系。マルチバイト不可。
- PCRE正規表現関数(Perl互換):preg_match()系。マルチバイトはUTF-8のみ対応。
- マルチバイト文字対応正規表現関数:mb_ereg()系。Rubyの正規表現を使用。PHP5.0で「鬼車」組み込み。
主な特徴?
- PCREはバイナリセーフで、POSIXはセーフじゃない。
- PCREの正規表現は//などのデリミタで囲う必要がある。
- Perl互換の正規表現構文を使用するpreg_match()のほうが、多くの場合ereg()よりも速く動作するらしい。
EUC-JPを使うのでmb_ereg。
●int mb_ereg ( string $pattern , string $string [, array $regs ] )
●int mb_ereg ( string $pattern , string $string [, array $regs ] )
- マルチバイト文字列に正規表現マッチを行う。
- マルチバイト対応の正規表現マッチを行い、一致した場合は 1 を返す。オプションの 3 番目の引数を指定した場合は、一致した部分のバイト数を返し、一致した部分文字列が配列 regs に格納される。空文字に一致した場合は 1 を返す。正規表現に一致しないか、エラーを発生した場合に FALSE を返す。
【正規表現例】
●IP4:xxx.xxx.xxx.xxxの形式チェック
"^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$"
●西暦日付:yyyy-mm-ddの形式チェック
"^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$"
●URL:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]"
●USERAGENT:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#\x20\[\]\{\}]"
●名前:漢字チェック(未定義含む全範囲)
"[\xa1\xa1-\xfe\xfe]"
●名前英語名:有効文字チェック(英文字、ハイフン、ピリオド、半角スペース)
"[a-zA-Z\-.\x20]+"
形式チェックは難しいかも。
●フリガナ:全角カナチェック(全角カナ、長音、全角・半角スペース)
"^[\x20ァ-ヶー- ]+$"
●Email:PHP系ライブラリの実装(バージョンで異なる可能性あり)
●IP4:xxx.xxx.xxx.xxxの形式チェック
"^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$"
●西暦日付:yyyy-mm-ddの形式チェック
"^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$"
●URL:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]"
●USERAGENT:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#\x20\[\]\{\}]"
●名前:漢字チェック(未定義含む全範囲)
"[\xa1\xa1-\xfe\xfe]"
●名前英語名:有効文字チェック(英文字、ハイフン、ピリオド、半角スペース)
"[a-zA-Z\-.\x20]+"
形式チェックは難しいかも。
●フリガナ:全角カナチェック(全角カナ、長音、全角・半角スペース)
"^[\x20ァ-ヶー- ]+$"
●Email:PHP系ライブラリの実装(バージョンで異なる可能性あり)
- phpspot:シンプル
'/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/'
- PEAR::Mail_RFC822:オーバーライン文字が入力できませんh
$regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?(オーバーライン):-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
- CakePHP:63文字の根拠は?
'/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i'
- Ethna
'/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i'
【正規表現注意事項】
- perlのサンプルで//囲みがあるものは不要なのではずす。
- 空白文字は\sじゃなくて、\x20。
- 16進数文字の連続(例:\x20\x20)は多バイト符号で表現された1文字と見なされる。
- 英語名表記はa~z,A~Z,-(ハイフン),.(ピリオド),'(アポ),"(ダブル)が見受けられる。アポとダブルはミドルネームのくくりに使われる。アポは発音補助(オライリー:O'Reilly)のように使われる。~3世の記述は、IIIとなる。数字0~9は使われない。通常判定は、英文字とハイフン、ピリオド、半角スペースでOK。
- emailについて
- emailはコメントネストがあるため正規表現では記述できないらしい。
- @より前の部分は、RFCの定義では半角英数記号なんでもありらしい。
- 日本では、プロバイダが発行するメールアカウントは、半角英数とハイフン、アンダーバー、ピリオドのみとするところがほとんどと思われる。(携帯含む)
- WEBメーラー系、特にGmailは、向こうの文化なので、アカウント部分に記号あり。Gmailの独自仕様?でアカウント部分の+文字から@までは無効らしい。なので記述し放題@@;
- 最適解は無い。自分のサイト運用に合わせて、チェック仕様(対インジェクション含む)を考える。
【参考URL】
●PHP で使用できる正規表現演算子(mb_ereg)
http://www.kt.rim.or.jp/~kbk/regex/regex.html#PHP
●鬼車正規表現
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
●EUC-JP文字コード表
http://charset.7jp.net/euc.html
●PHP で使用できる正規表現演算子(mb_ereg)
http://www.kt.rim.or.jp/~kbk/regex/regex.html#PHP
●鬼車正規表現
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
●EUC-JP文字コード表
http://charset.7jp.net/euc.html
![]() | 本作品采用 知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。 |