正規表現とは、あるパターンの文字列を一つの文字列で表現する方法の一つです。
形式言語理論の分野では、正則表現とも呼ばれています。
PHPでは、文字列の抽出や判定に良く使われています。
プログラミングでは入力チェックや、特定の値を抽出するときなどによく使用しますね。
オプション | |
---|---|
i | 大文字小文字を区別しない |
m | マルチラインモード |
s | ドットメタ文字を改行を含む全ての文字にマッチ |
x | 空白を無視 |
エスケープシーケンス | |
---|---|
\\ | \ |
\n | 改行 |
\t | 水平タブ |
\a | ベル |
\b | バックスペース |
\r | キャリッジリターン |
\v | 垂直タブコード |
\e | エスケープコード |
\z | エンドオブファイル(EOF) |
\" | ダブルクオート |
\' | シングルクオート |
メタ文字 | |
---|---|
. | 改行を除く任意の1文字 |
* | 0回以上の連続する文字 |
+ | 1回以上の連続する文字 |
? | 0または1回だけの文字 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
\ | エスケープ文字 |
| | OR |
() | パターングループ |
[] | 文字クラス |
{} | 量指定子 |
\n | 改行 |
\r | キャリッジリターン |
\t | タブ |
\d | 数字 [0-9] |
\D | 数字以外 [^0-9] |
\w | 英数字 [_a-zA-Z0-9] |
\W | 英数字以外 [^_a-zA-Z0-9] |
\s | 空白 [ \t \r\f] |
\S | 空白以外 [^ \t\n\r\f] |
\b | 単語境界 \w、\Wの間 |
\B | 単語境界以外 |
\x?? | 16進数 |
文字クラス | |
---|---|
- | 範囲 |
^ | 「以外」にマッチ |
a-z | 小文字の半角英文字 |
A-Z | 大文字の半角英文字 |
0-9 | 数字 |
^0-9 | 数字以外 |
[:alnum:] | [:alpha:]+[:digit:] |
[:alpha:] | [:lower:]+[:upper:] |
[:lower:] | 小文字の半角英文字 [a-z] |
[:digit:] | 数字 [0-9] |
[:blank:] | スペースとタブ [ \t] |
[:cntrl:] | 制御文字 |
[:graph:] | [:alnum:]+[:punct:] |
[:print:] | [:alnum:]+[:punct:]+スペース |
[:punct:] | ! " # $ % & ' ( ) * + , - . / |
[:space:] | 空白文字 [ \t\n\r\f\v] |
[:upper:] | 大文字の半角英文字 [A-Z] |
[:xdigit:] | 16進数 [0-9A-Fa-f] |
量指定子 | |
---|---|
* | 0回以上の連続する文字 |
+ | 1回以上の連続する文字 |
? | 0または1回だけの文字 |
{n}? | n回の連続する文字 |
{n,}? | n回以上の連続する文字 |
{n, m}? | n回以上、m回以下の連続する文字 |
PHPで正規表現を用いた抽出、判定を行うには、preg_match関数を使用します。
第一引数に正規表現、第二引数に検索する文字列、第三引数に抽出データを格納する変数を指定します。
preg_match関数は、マッチした場合に true を、しない場合に false を返します。
ある文字列から、マッチする複数の文字列を抽出したい場合は、preg_match_all関数を使用します。
$str = "info@example.com";
if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $str)) {
echo "OK";
} else {
echo "NG";
}
$str = "130-0001";
if (preg_match("/^\d{3}\-\d{4}$/", $str)) {
echo "OK";
} else {
echo "NG";
}
// XX-XXXX-XXXX の場合
$str = "03-1234-5678";
if (preg_match("/^\d{2}\-\d{4}\-\d{4}$/", $str)) {
echo "OK";
} else {
echo "NG";
}
// XXX-XXXX-XXXX の場合
$str = "080-1234-5678";
if (preg_match("/^\d{3}\-\d{4}\-\d{4}$/", $str)) {
echo "OK";
} else {
echo "NG";
}
// XXXX-XXXX の場合
$str = "1234-5678";
if (preg_match("/^\d{4}\-\d{4}$/", $str)) {
echo "OK";
} else {
echo "NG";
}
// XX-XXXX の場合
$str = "34-5678";
if (preg_match("/^\d{2}\-\d{4}$/", $str)) {
echo "OK";
} else {
echo "NG";
}