PHP 正規表現で数値を返す(preg_match)

PHPの正規表現で数値を返すサンプルです。
preg_match関数を使用します。

確認環境
・PHP 7.1.8

目次

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

文字列を検索する

文字列を検索するサンプルです。

<?php

$a = "/BC/";

echo preg_match($a,"ABC"); //1

echo preg_match($a,"ACB"); //0

?> 

3行目は、正規表現で文字列「BC」があるかを指定しています。
5行目はマッチするので1に、7行目はマッチしないので0になります。

文字をORで検索する

文字をORで検索するサンプルです。

<?php

$a = "/[AB]/";

echo preg_match($a,"ABC"); //1

echo preg_match($a,"ZZB"); //1

echo preg_match($a,"ZZZ"); //0

?> 

3行目は、正規表現で「A」または「B」があるかを指定しています。
5,7行目は1に、9行目は0になります。

文字を否定で検索する

文字を否定で検索するサンプルです。

<?php

$a = "/[^A]/";

echo preg_match($a,"ZZZ"); //1

echo preg_match($a,"ZAA"); //1

echo preg_match($a,"AAA"); //0

?> 

3行目は、正規表現で「A」以外の文字があるか指定しています。
5,7行目は、「A」以外の文字があるので1になります。
9行目は、「A」以外の文字がないので0になります。

文字を範囲で指定して検索する

文字を範囲で指定して検索するサンプルです。

<?php

$a = "/[A-C]/";

echo preg_match($a,"ABC"); //1

echo preg_match($a,"ZZC"); //1

echo preg_match($a,"ZZZ"); //0

?> 

3行目は、正規表現で「A」または「B」または「C」の文字があるか指定しています。
5,7行目は、指定の文字があるので1になります。
9行目は、指定の文字がないので0になります。

先頭の文字列を検索する

先頭の文字列を検索するサンプルです。

<?php

//$a = "/^ZX/";
$a = "/\AZX/u";

echo preg_match($a,"ZXC"); //1

echo preg_match($a,"AZX"); //0

?> 

4行目は、正規表現で「ZX」が先頭にあるかを指定しています。uは文字列をUTF-8として扱います。
6行目は、指定の文字があるので1になります。
8行目は、指定の文字がないので0になります。
3行目の^は使用せず、4行目の\Aを使用します。
正規表現の ^ と $ は使わずに \A と \z を使う理由

文字列の最後尾を検索する

文字列の最後尾を検索するサンプルです。

<?php

//$a = "/TK$/";
$a = "/TK\z/u";

echo preg_match($a,"ZTK"); //1

echo preg_match($a,"TKZ"); //0

?> 

4行目は、正規表現で「TK」が最後尾にあるかを指定しています。uは文字列をUTF-8として扱います。
6行目は、指定の文字があるので1になります。
8行目は、指定の文字がないので0になります。
3行目の$は使用せず、4行目の\zを使用します。
正規表現の ^ と $ は使わずに \A と \z を使う理由

連続する文字を指定して検索する

連続する文字を指定して検索するサンプルです。

<?php

$a = "/c{2}/";

echo preg_match($a,"acccb"); //1

echo preg_match($a,"accb"); //1

echo preg_match($a,"acbc"); //0

?> 

3行目は、正規表現で「c」が2回連続することを指定しています。
5,7行目は、指定の文字があるので1になります。
9行目は、指定の文字がないので0になります

連続する文字(個以上)を指定して検索する

連続する文字(個以上)を指定して検索するサンプルです。

<?php

$a = "/c{2,}/";

echo preg_match($a,"acccb"); //1

echo preg_match($a,"accb"); //1

echo preg_match($a,"acbc"); //0

?> 

3行目は、正規表現で「c」が2回以上連続することを指定しています。
5,7行目は、指定の文字があるので1になります。
9行目は、指定の文字がないので0になります。

1回以上出現している文字を検索する+iオプション

1回以上出現している文字を検索する+iオプションのサンプルです。

<?php

$a = "/c+/i";

echo preg_match($a,"acb"); //1

echo preg_match($a,"ACB"); //1

echo preg_match($a,"ab"); //0

?> 

3行目は、正規表現で「c」または「C」が1回以上出現していることを指定しています。
iオプションは、大文字と小文字の区別をしません。
5,7行目は、指定の文字があるので1になります。
9行目は、指定の文字がないので0になります。

1桁以上の半角数値のみかをチェックする

1桁以上の半角数値のみかをチェックするサンプルです。。

<?php

$a = "/^[0-9]+$/";

echo preg_match($a,"123456"); //1

echo preg_match($a,"123a"); //0

echo preg_match($a,"a"); //0

?> 

3行目は、正規表現で1桁以上の半角数値のみであることを指定しています。
5行目は、指定の文字があるので1になります。
7行目は、数値以外の文字があるので0になります。
9行目は、数値がないので0になります。

1桁以上の半角数値または英字の小文字(a-f)のみかをチェックする

1桁以上の半角数値または英字の小文字(a-f)のみかをチェックするサンプルです。

<?php

$a = "/^[0-9a-f]+$/";

echo preg_match($a,"123456abc"); //1

echo preg_match($a,"123"); //1

echo preg_match($a,"abc"); //1

echo preg_match($a,"123A"); //0

?> 

3行目は、正規表現で1桁以上の半角数値または英字の小文字(a-f)のみかを指定しています。
5,7,9行目は、指定の文字があるので1になります。
11行目は、英字の大文字があるので0になります。

郵便番号の桁数と数値のチェックする

郵便番号の桁数と数値のチェックするサンプルです。

<?php

$a = "/^\d{3}-\d{4}$/";

echo preg_match($a,"123-4567"); //1

echo preg_match($a,"1234567"); //0

echo preg_match($a,"1234-567"); //0

?> 

3行目は、正規表現で郵便番号の桁数と数値であることを指定しています。
5行目は、指定の文字列なので1になります。
7,9行目は、指定の文字列ではないので0になります。

正規表現の主なパターン

以下は、正規表現の主なパターンです。

パターン パターンの意味
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を返してしまうからです。

以下は、サンプルです。

<?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

?>

2行目は^ と $を使用しています。数値のみでマッチ(1)を返します。
4行目は^ と $を使用しています。データ末尾に改行がありますがマッチ(1)を返します。
6行目は\A と \z を使用しています。データ末尾に改行がありますがマッチしていない(0)を返します。

参考:徳丸浩の日記  正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう

関連の記事

PHP 文字列を分割して配列にするサンプル(preg_split)
PHP 文字列を置き換える(str_replace/preg_replace)

△上に戻る