heike1 发表于 2015-8-29 11:31:55

【php】正規表現

【概要】
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 ] )

[*]マルチバイト文字列に正規表現マッチを行う。
[*]マルチバイト対応の正規表現マッチを行い、一致した場合は 1 を返す。オプションの 3 番目の引数を指定した場合は、一致した部分のバイト数を返し、一致した部分文字列が配列 regs に格納される。空文字に一致した場合は 1 を返す。正規表現に一致しないか、エラーを発生した場合に FALSE を返す。


【正規表現例】
●IP4:xxx.xxx.xxx.xxxの形式チェック
"^({1,3})\.({1,3})\.({1,3})\.({1,3})$"
●西暦日付:yyyy-mm-ddの形式チェック
"^({4})-({1,2})-({1,2})$"
●URL:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]"
●USERAGENT:有効文字以外をチェック
"[^\-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#\x20\[\]\{\}]"
●名前:漢字チェック(未定義含む全範囲)
"[\xa1\xa1-\xfe\xfe]"
●名前英語名:有効文字チェック(英文字、ハイフン、ピリオド、半角スペース)
"+"
形式チェックは難しいかも。
●フリガナ:全角カナチェック(全角カナ、長音、全角・半角スペース)
"^[\x20ァ-ヶー- ]+$"
●Email:PHP系ライブラリの実装(バージョンで異なる可能性あり)

[*]phpspot:シンプル

'/^+?@+$/'

[*]PEAR::Mail_RFC822:オーバーライン文字が入力できませんh

$regex = $strict ? '/^([.0-9a-z_+-]+)@((+\.)+{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?(オーバーライン):-]+)@((+\.)+{2,})$/i';

[*]CakePHP:63文字の根拠は?

'/\\A(?:^(*)@({0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|{2,4}))$)\\z/i'

[*]Ethna

'/^(|\-|\.|\+)+@((|\-)+\.)+{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
页: [1]
查看完整版本: 【php】正規表現