PHP 正規表現メモ


共通する考え方

  • 表現したい文字列・数値を書く
  • 複数のパターンになる箇所を正規表現に置き換える
  • パターンが繰り返される箇所を括弧でくくる
  • 繰り返す、もしくは有無を表現する(?+*等)
  • 特殊文字があればエスケープする(.等)

正規表現を可視化するサービス

どこを検索したいかを整理

  • 部分一致 xxx
  • 前方一致 ^xxx
  • 後方一致 xxx$
  • 完全一致 ^xxx$

^は[]内で使用されると否定を表す

数字

  • [0-9]:1桁の数字
  • [0-9]+:1桁以上の数字

[...] 各括弧に含まれるいずれかの1文字にマッチ
+ 直前の文字が1回以上繰り返す場合にマッチする
[...]+ 各括弧に含まれるいずれかの1文字に全てに適用される

URL

  • https?:\/\/ :httpかhttps(sが0か1個)
  • ([a-zA-Z0-9]+\.)*dummy.co.jp : サブドメイン0個以上許容
  • ([a-zA-Z0-9]+\.)?dummy.co.jp : サブドメイン0個か1個許容
  • ([a-zA-Z0-9]+\.){0,2}dummy.co.jp : サブドメイン0-2個まで

[a-zA-Z0-9]+\. : 「英語数字」と「.」のセット
([a-zA-Z0-9]+\.)* :「英語数字が1回以上」と「.」のセットを0個以上
([a-zA-Z0-9]+\.)? :「英語数字が1回以上」と「.」のセットを0か1個
([a-zA-Z0-9]+\.){0,2} :「英語数字が1回以上」と「.」のセットが0~2個まで

URLパラメータ

/^\?([^=&?#\/]+(=[^=&?#\/]*)?)(&[^=&?#\/]+(=[^=&?#\/]*)?)*$/
  • パラメータのvalueは無くても大丈夫
  • [^=&?#\/]によりURLの予約文字(=&?#/)を除外している
    • []内の?はエスケープ不要

brタグ

  • brタグ内の、半角スペースとスラッシュを全て削除
  • ※class名がある際に必要な半角スペースは許可する
    • 第一引数に設定したパターンにマッチするのは<br >,<br />等なため、class名で必要なスペースなどは守られる
replace
$before = 'xxx<br  //>xxx';
$before = '<br class="hidden">';

$after = preg_replace('/<br[ \/]*>/','<br>',$before);
var_dump($after);exit;

マルチバイト文字

マルチバイト文字は全角文字とだいたい同じ意味。
日本語は全部マルチバイト文字なので、対象の文字列が日本語かつ正規表現を使用する関数(preg_match等)を使うときはパターン修飾子が必要

preg_match('/正規表現/u',$haystack)

複雑なバリデーションをシンプルに機能させるやり方

許可パターンにマッチ、拒否パターンにマッチしない、のAND条件で評価する

「A」が含まれる値を許可

  • ^.7.$
  • ^[^7]7[^7]$
  • /7/

「プログラミング」が含まれない値を許可

  • /^(?!.プログラミング).$/u
  • /^((?!プログラミング).)*$/u

電話番号で携帯電話を除外する

許可:^0\d+-\d+-\d+$
拒否:^(070|080|090)

メールアドレスで携帯電話を除外する

許可:^[^@]+@[\w-]+(.[\w-]+)+$
拒否:^(ezweb.ne.jp|docomo.ne.jp|softbank.ne.jp)$

正規表現チェッカー

参考リンク