PHPの正規表現で文字列を検索するサンプルです。
preg_match関数を使用します。
| 確認環境 ・PHP 7.1.8 |
目次
- preg_match関数
- preg_match_all関数
- 文字列を検索する
- 文字をORで検索する
- 文字を否定で検索する
- 文字を範囲で指定して検索する
- 先頭の文字列を検索する
- 文字列の最後尾を検索する
- 連続する文字を指定して検索する
- 連続する文字(個以上)を指定して検索する
- 1回以上出現している文字を検索する+iオプション
- 1桁以上の半角数値のみかをチェックする
- 1桁以上の半角数値または英字の小文字(a-f)のみかをチェックする
- 郵便番号の桁数と数値のチェックする
- 正規表現の主なパターン
- 主なパターン修飾子
- 正規表現の ^ と $ は使わずに \A と \z を使う理由
preg_match関数
| int preg_match ( string 正規表現のパターン , string 検索対象の文字列 [, array 検索結果 [, int $flags = 0 [, int $offset = 0 ]]] ) |
- 正規表現で文字列を検索します。
- 戻り値について
マッチした場合、1を返します。
マッチしなかった場合、0を返します。
エラーが発生した場合、falseを返します。 - preg_match関数の3つ目の引数は、配列で検索結果が入ります。
- 以下は、PHPマニュアルのpreg_match関数のリンクです。
http://php.net/manual/ja/function.preg-match.php
preg_match_all関数
- 正規表現で文字列を検索し、マッチ後も検索を行います。
- 戻り値は、パターンがマッチした総数を返します。
- 以下は、PHPマニュアルのpreg_match_all関数のリンクです。
http://php.net/manual/ja/function.preg-match-all.php
文字列を検索する
4行目は、正規表現で文字列「BC」があるかを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCあいBCう";
$p1 = "/BC/";
$num1 = preg_match($p1,$str1,$test1);
echo $num1; //1
print_r($test1); //Array ( [0] => BC )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array ( [0] => Array ( [0] => BC [1] => BC ) )
?>
文字をORで検索する
4行目は、正規表現で「F」or「い」があるかを指定しています。uは文字列をUTF-8として扱います。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCあいうい";
$p1 = "/[Fい]/u";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => い )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array ( [0] => Array ( [0] => い [1] => い ) )
?>
文字を否定で検索する
4行目は、正規表現で「A」「B」「C」「い」以外を指定しています。uは文字列をUTF-8として扱います。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCあいう";
$p1 = "/[^ABCい]/u";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => あ )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array( [0] => Array ( [0] => あ [1] => う ) )
?>
文字を範囲で指定して検索する
4行目は、正規表現で「D」or「E」or「F」を指定しています。uは文字列をUTF-8として扱います。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数3が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCDEFGHIあいう";
$p1 = "/[D-F]/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => D )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //3
print_r($test2); //Array ( [0] => Array ( [0] => D [1] => E [2] => F ) )
?>
先頭の文字列を検索する
4行目は、正規表現で「AB」が先頭にあるかを指定しています。uは文字列をUTF-8として扱います。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
正規表現の ^ と $ は使わずに \A と \z を使う理由
<?php
$str1 = "あいう";
//$p1 = "/^あい/";
$p1 = "/\Aあい/u";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => あい )
?>
文字列の最後尾を検索する
4行目は、正規表現で「いう」が最後尾にあるかを指定しています。uは文字列をUTF-8として扱います。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
正規表現の ^ と $ は使わずに \A と \z を使う理由
<?php
$str1 = "ABCDEFGHIあいう";
//$p1 = "/いう$/u";
$p1 = "/いう\z/u";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => いう )
?>
連続する文字を指定して検索する
4行目は、正規表現で「c」が2回出現していることを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCccbcccあいう";
$p1 = "/c{2}/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => cc )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array ( [0] => Array ( [0] => cc [1] => cc ) )
?>
連続する文字(個以上)を指定して検索する
4行目は、正規表現で「c」が2回以上出現していることを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCcbcccあいccう";
$p1 = "/c{2,}/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => ccc )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array ([0] => Array ( [0] => ccc [1] => cc ))
?>
1回以上出現している文字を検索する+iオプション
4行目は、正規表現で「c」or「C」が1回以上あることを指定しています。
iオプションは、大文字と小文字の区別をしません。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
10行目は、preg_match_all関数です。
11行目はマッチした総数2が表示され、12行目はマッチした結果が表示されます。
<?php
$str1 = "ABCcbcccあいう";
$p1 = "/c+/i";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => Cc )
$num2 = preg_match_all($p1,$str1,$test2);
echo $num2; //2
print_r($test2); //Array ( [0] => Array ( [0] => Cc [1] => ccc ) )
?>
1桁以上の半角数値のみかをチェックする
4行目は、正規表現で1桁以上の半角数値のみかを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
<?php
$str1 = "123456";
$p1 = "/\A[0-9]+\z/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array( [0] => 123456 )
?>
1桁以上の半角数値または英字の小文字(a-f)のみかをチェックする
4行目は、正規表現で1桁以上の半角数値または英字の小文字(a-f)のみかを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
<?php
$str1 = "123456abc";
$p1 = "/\A[0-9a-f]+\z/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => 123456abc )
?>
郵便番号の桁数と数値のチェックする
4行目は、正規表現で郵便番号の桁数と数値のチェックを指定しています。
6行目は、preg_match関数で2行目の文字列を4行目の正規表現で検索しています。
8行目はマッチしたので1が表示され、9行目はマッチした結果が表示されます。
<?php
$str1 = "123-4567";
$p1 = "/\A\d{3}-\d{4}\z/";
$num = preg_match($p1,$str1,$test1);
echo $num; //1
print_r($test1); //Array ( [0] => 123-4567 )
?>
正規表現の主なパターン
以下は、正規表現の主なパターンです。
| パターン | パターンの意味 |
|---|---|
| ABD | ABDという文字か。 |
| [ABD] | A or B or Dのどれか1文字が入っているか。 |
| [^ABD] | A と B と D以外の1文字が入っているか。 |
| [A-D] | A or B or C or Dのどれか1文字が入っているか。 |
| (ABD) | ABDという文字列を表す。()はまとめるときに使用します。 |
| A|B|D | A or B or Dのどれか1文字が入っているか。 |
| [a-zA-Z] | 英字の小文字のaからzまたは大文字のAからZのどれか1文字が入っているか。 |
| \AT | 先頭の文字はTか。正規表現の ^ と $ は使わずに \A と \z を使う理由 |
| T\z | 最後尾の文字はTか。正規表現の ^ と $ は使わずに \A と \z を使う理由 |
| * | *の直前の文字が0回以上の繰り返し |
| + | +の直前の文字が1回以上の繰り返し |
| ? | ?の直前の文字が0回または1回の繰り返し |
| {n} | n回続いている。 |
| {n,} | n回以上続いている |
| . | 任意の一文字を表す。 |
| ¥s | 比較する文字に、空白1文字がある。 |
| ¥S | 比較する文字に、空白以外の1文字がある。 |
| ¥d | 比較する文字に、数字1文字がある。 ([0-9]と同じ) |
| ¥D | 比較する文字に、数字以外の1文字がある。 ([^0-9]と同じ) |
| ¥w | 比較する文字に、小文字の英字 or 大文字の英字 or 数値 or アンダースコアの1文字がある。 [a-zA-Z0-9_]と同じ |
| ¥W | ¥wの否定。 [^¥w]と同じ |
主なパターン修飾子
以下は、主なパターン修飾子です。
| オプション | 説明 |
|---|---|
| i | 大文字も小文字もマッチする |
| u | 対象文字列をUTF-8として扱う |
以下は、PHPマニュアルのパターン修飾子のリンクです。
http://php.net/manual/ja/reference.pcre.pattern.modifiers.php
正規表現の ^ と $ は使わずに \A と \z を使う理由
正規表現の ^ と $は使わずに \A と \z を使う理由は、 ^ と $の場合、データ末尾に改行が含まれていてもmatchを返してしまうからです。
2行目は^ と $を使用しています。数値のみでマッチ(1)を返します。
4行目は^ と $を使用しています。データ末尾に改行がありますがマッチ(1)を返します。
6行目は\A と \z を使用しています。データ末尾に改行がありますがマッチしていない(0)を返します。
<?php
print (preg_match('/^[0-9]+$/', "123")); //1
print (preg_match('/^[0-9]+$/', "123\n")); //1
print preg_match('/\A[0-9]+\z/', "123\n"); //0
?>
参考:正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう
関連の記事
PHP 文字列を区切り文字で分割するサンプル(preg_split)
PHP 文字列を置き換えるサンプル(preg_replace)