PHP 正規表現によるパターンマッチ
PHPで正規表現による文字列処理を行ったときのメモです。
文字列の指定によるパターンマッチ
指定の文字が含まれているか
"JUGEM"という文字で調べる。
<?php //含まれていればOK、そうでなければNG if (preg_match('/JUGEM/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'aaaJUGEMaaa' → OK 'aaaJUGEM' → OK 'JUGEMaaa' → OK 'JUGEM' → OK 'JUaaaGEM' → NG
先頭に指定の文字が含まれているか
"JUGEM"という文字で調べる。
<?php //含まれていればOK、そうでなければNG if (preg_match('/^JUGEM/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'aaaJUGEMaaa' → NG 'aaaJUGEM' → NG 'JUGEMaaa' → OK 'JUGEM' → OK 'JUaaaGEM' → NG
終端に指定の文字が含まれているか
"JUGEM"という文字で調べる。
<?php //含まれていればOK、そうでなければNG if (preg_match('/JUGEM$/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'aaaJUGEMaaa' → NG 'aaaJUGEM' → OK 'JUGEMaaa' → NG 'JUGEM' → OK 'JUaaaGEM' → NG
指定の文字と完全に一致しているか
"JUGEM"という文字で調べる。
<?php //一致していればOK、でなければNGを出力 if (preg_match('/^JUGEM$/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'aaaJUGEMaaa' → NG 'aaaJUGEM' → NG 'JUGEMaaa' → NG 'JUGEM' → OK 'JUaaaGEM' → NG
文字の個数によるパターンマッチ
任意の文字1個が含まれているか調べる
ドット"."を使う。
<?php //"J(任意の3文字)M"が含まれていればOK、そうなければNG if (preg_match('/J...M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → OK 'JUGM' → NG 'JUGEEEM' → NG 'JUGaM' → OK 'JUGEaaaM' → NG
直前の文字が0回以上続くか調べる
アスタリスク"*"を使う。
<?php //"JUG(Eが0回以上続く)M"が含まれていればOK、そうなければNG if (preg_match('/JUGE*M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → OK 'JUGM' → OK 'JUGEEEEM' → OK 'JUGaM' → NG 'JUGEaaaM' → NG
直前の文字が1回以上続くか調べる
プラス"+"を使う。
<?php //"JUG(Eが1回以上続く)M"が含まれていればOK、そうなければNG if (preg_match('/JUGE+M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → OK 'JUGM' → NG 'JUGEEEEM' → OK 'JUGaM' → NG 'JUGEaaaM' → NG
直前の文字が0回か、1回か調べる
クエスチョンマーク"?"を使う。
<?php //"JUG(Eが0回か、1回)M"が含まれていればOK、そうなければNG if (preg_match('/JUGE?M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → OK 'JUGM' → OK 'JUGEEEEM' → NG 'JUGaM' → NG 'JUGEaaaM' → NG
直前の文字がx回以上続くか調べる
{x,}を使う。
<?php //"JUG(Eが3回以上続く)M"が含まれていればOK、そうなければNG if (preg_match('/JUGE{3,}M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → NG 'JUGEEEM' → OK 'JUGEEEEEM' → OK 'JUGEEEEEEEM' → OK
直前の文字がx回以上、y回以下続くか調べる
{x,y}を使う。
<?php //"JUG(Eが3回以上、5回以下)M"が含まれていればOK、そうなければNG if (preg_match('/JUGE{3,5}M/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'JUGEM' → NG 'JUGEEEM' → OK 'JUGEEEEEM' → OK 'JUGEEEEEEEM' → NG
メタ文字自体をパターンマッチの文字として扱う
手前に¥マークを付ける。
<?php //"test.txt"が含まれていればOK、そうなければNGを出力 if (preg_match('/test¥.txt/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'test.txt' → OK 'test1txt' → NG
文字の範囲を指定したパターンマッチ
指定した複数の文字どれかが含まれているか調べる
文字クラス"[]"を使う。
<?php //"Windows 95"か"Windows 98"が含まれていればOK、そうなければNGを出力 if (preg_match('/Windows 9[58]/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Windows 95' → OK 'Windows 98' → OK 'Windows 99' → NG
半角数字が含まれているか調べる
文字クラス"[]"のなかで、ハイフン"-"による範囲指定する。
<?php //"Red Hat (半角数字)"が含まれていればOK、そうなければNGを出力 if (preg_match('/Red Hat [0-9]/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Red Hat 0' → OK 'Red Hat 5' → OK 'Red Hat 9' → OK 'Red Hat E' → NG
半角英数字が含まれているか調べる
文字クラス"[]"のなかで、ハイフン"-"による範囲指定を複数並べる。
<?php //"Mac OS (半角英数字)"が含まれていればOK、そうなければNGを出力 if (preg_match('/Mac OS [A-Za-z0-9]/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Mac OS X' → OK 'Mac OS x' → OK 'Mac OS 9' → OK 'Mac OS #' → NG
半角英数字以外が含まれているか調べる
文字クラス"[]"の先頭に、"^"を使う。
<?php //"Mac OS (半角英数字以外)"が含まれていればOK、そうなければNGを出力 if (preg_match('/Mac OS [^A-Za-z0-9]/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Mac OS X' → NG 'Mac OS x' → NG 'Mac OS 9' → NG 'Mac OS #' → OK
先頭を意味するメタ文字"^"は、文字クラス"[]"の先頭に置くと否定の意味になる。
複数の文字列の指定によるパターンマッチ
指定した複数の文字列どれかがが含まれているか調べる
"|"を使う。
<?php //"Windows"か"Fedora"か"Mac"が含まれていればOK、そうなければNGを出力 if (preg_match('/Windows|Fedora|Mac/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Windows' → OK 'Fedora' → OK 'Mac' → OK 'Unix' → NG
グループ化した直前の文字が1回以上続くか調べる
円括弧"()"を使う。
<?php //"(Potatoが1回以上続く) Chips"が含まれていればOK、そうなければNGを出力 if (preg_match('/(Potato)+ Chips/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'Potatoooo Chips' → NG 'Potatotototo Chips' → NG 'PotatoPotatoPotato Chips' → OK
複数の文字列どれかが一部分に含まれているか調べる
円括弧"()"と"|"を組み合わせて使う。
<?php //"I like (ShoyuかShio)Ramen"が含まれていればOK、そうなければNGを出力 if (preg_match('/I like (Shoyu|Shio)Ramen/', $string)) { echo 'OK'; } else { echo 'NG'; } ?>
「検証結果」
($string) → (出力) 'I like ShoyuRamen' → OK 'I like ShioRamen' → OK 'I like MisoRamen' → NG
よく使う正規表現のサンプル集
郵便番号
preg_match('/^[0-9]{3}-[0-9]{4}$/', $string)
すべて半角英数字
preg_match('/^[a-zA-Z0-9]+$/', $string)
URL
preg_match('/^(https?|ftp)(:¥/¥/[-_.!~*¥'()a-zA-Z0-9;¥/?:¥@&=+¥$,%#]+)$/', $string)
メールアドレス
preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9¥._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9¥._-]+)+$/', $string)
HTMLカラー(16進数)
preg_match('/^#[a-fA-F0-9]{6}$/', $string)
- 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/26
- メディア: 大型本
- 購入: 24人 クリック: 754回
- この商品を含むブログ (82件) を見る