• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【php】正規表現

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
【概要】
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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PHP静态缓存发布时间:2022-07-10
下一篇:
PHPFunction参数传递发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap