#共通する考え方
- 表現したい文字列・数値を書く
- 複数のパターンになる箇所を正規表現に置き換える
- パターンが繰り返される箇所を括弧でくくる
- 繰り返す、もしくは有無を表現する(?+*等)
- 特殊文字があればエスケープする(.等)
正規表現を可視化するサービス
どこを検索したいかを整理
- 部分一致 xxx
- 前方一致 ^xxx
- 後方一致 xxx$
- 完全一致 ^xxx$
^は[]内で使用されると否定を表す
#数字
- 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)$
正規表現チェッカー
参考リンク