LoginSignup
0
0

More than 3 years have passed since last update.

PHP 正規表現メモ

Last updated at Posted at 2020-06-08

共通する考え方

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

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

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

  • 部分一致 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)$

正規表現チェッカー

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0