とりあえずの備忘録

主にパソコンやインターネットに関するメモ

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)

詳説 正規表現 第3版

詳説 正規表現 第3版

  • 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/04/26
  • メディア: 大型本
  • 購入: 24人 クリック: 754回
  • この商品を含むブログ (82件) を見る