zoukankan      html  css  js  c++  java
  • 【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