Fieds_labo1

php-正規表現

最終更新:

fieds_labo1

- view
管理者のみ編集可

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の形式チェック
"^([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


★年月日
ゼロからはじめる正規表現 秀丸編 - 年月日の表記を統一する
http://journal.mycom.co.jp/articles/2009/01/15/hidemaru/index.html

●bool checkdate ( int $month , int $day , int $year )
  • 指定した日付が有効な場合TRUE、そうでない場合FALSE
  • 年は1-32767、月は1-12、日は月とうるう年考慮


★メールアドレス
「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
http://blog.livedoor.jp/dankogai/archives/51189905.html
メールアドレスに一致する正規表現
http://www.tt.rim.or.jp/~canada/comp/cgi/tech/mailaddrmatch/
メールアドレスの正規表現
http://www.din.or.jp/~ohzaki/mail_regex.htm
メールアドレスが正しいか確認する方法
http://neta.ywcafe.net/000407.html

んー、コメントは控えとくw







記事メニュー
人気記事ランキング
目安箱バナー