[PHP] preg_match 正規表現で数値を返す

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

目次

関数 preg_matchとは
AB 文字列を指定
[AB] 文字をORで指定
[^A] 文字を否定で指定
[A-C] 文字を範囲で指定
\A 先頭の文字列を指定
\z 末尾の文字列を指定
c{2} 連続する文字を指定
[0-9]{1,} 数値1桁以上を指定
^[0-9]{5}$ 数値(0-9)の5桁+先頭と末尾も(0-9)
^[0-9a-f]{5}$ 数値(0-9)と英字(a-f)の5桁+先頭と末尾も(0-9 or a-f)
^[0-9]{3}-[0-9]{4}$ 郵便番号(数値3桁とハイフンと数値4桁)+先頭と末尾も(0-9)
エスケープ ドット(.)を文字として指定(エスケープ)
パターン 正規表現の主なパターン
  主なパターン修飾子
参考 正規表現の ^ と $ は使わずに \A と \z を使う理由

preg_matchとは

int preg_match ( 正規表現のパターン ,  検索対象の文字列 [, array 検索結果 [, int $flags = 0 [, int $offset = 0 ]]] )
  • 正規表現で文字列を検索します。
  • マッチした場合、1を返します。
  • マッチしなかった場合、0を返します。
  • エラーが発生した場合、falseを返します。
  • preg_match関数の3つ目の引数は、配列で検索結果が入ります。

文字列を指定

<?php
$a = "/BC/";

echo preg_match($a,"ABC"); //1 マッチする
echo preg_match($a,"ACB"); //0 マッチしない
?> 

2行目は、文字列「BC」を指定しています。

文字をORで指定

<?php
$a = "/[AB]/";

echo preg_match($a,"ABC"); //1 マッチする
echo preg_match($a,"ZZB"); //1 マッチする
echo preg_match($a,"ZZZ"); //0 マッチしない
?> 

2行目は、「A」または「B」を指定しています。

文字を否定で指定

<?php
$a = "/[^A]/";

echo preg_match($a,"ZZZ"); //1 マッチする
echo preg_match($a,"ZAA"); //1 マッチする
echo preg_match($a,"AAA"); //0 マッチしない
?> 

2行目は、「A」以外の文字を指定しています。

文字を範囲で指定

<?php
$a = "/[A-C]/";

echo preg_match($a,"ABC"); //1 マッチする
echo preg_match($a,"ZZC"); //1 マッチする
echo preg_match($a,"ZZZ"); //0 マッチしない
?> 

2行目は、「A」または「B」または「C」の文字を指定しています。

先頭の文字列を指定

<?php
//$a = "/^ZX/";
$a = "/\AZX/u";

echo preg_match($a,"ZXC"); //1 マッチする
echo preg_match($a,"AZX"); //0 マッチしない
?> 

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

末尾の文字列を指定

<?php
//$a = "/TK$/";
$a = "/TK\z/u";

echo preg_match($a,"ZTK"); //1 マッチする
echo preg_match($a,"TKZ"); //0 マッチしない
?> 

3行目は、末尾が「TK」の文字を指定しています。uは文字列をUTF-8として扱います。
2行目の$は使用せず、3行目の\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 マッチしない
?> 

2行目は、「c」が2回連続することを指定しています。

数値1桁以上を指定

<?php
$ptr = "/[0-9]{1,}-/";

echo preg_match($ptr,"1-"); //1 マッチする
echo preg_match($ptr,"123-"); //1 マッチする
echo preg_match($ptr,"ab1-"); //1 マッチする
echo preg_match($ptr,"a1b-"); //0 マッチしない
?>

2行目は、数値1桁以上とハイフン(-)を指定しています。

数値(0-9)の5桁+先頭と末尾も(0-9)

<?php
$a = "/^[0-9]{5}$/";

echo preg_match($a,"12345"); //1 マッチする
echo preg_match($a,"a2345"); //0 マッチしない 文字あり
echo preg_match($a,"123456"); //0 マッチしない 桁でない
?> 

 

数値(0-9)と英字(a-f)の5桁+先頭と末尾も(0-9 or a-f)

<?php
$a = "/^[0-9a-f]{5}$/";

echo preg_match($a,"1a23b"); //1 マッチする
echo preg_match($a,"a1bc"); //0 マッチしない 桁数不足
echo preg_match($a,"12345"); //1 マッチする 数値のみ
echo preg_match($a,"abcde"); //1 マッチする 英字のみ
?> 

 

郵便番号(数値3桁とハイフンと数値4桁)+先頭と末尾も(0-9)

<?php
$a = "/^[0-9]{3}-[0-9]{4}$/";
//$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 マッチしない
?> 

2行目と3行目は同じ意味です。\dは、数値を意味します。

ドット(.)を文字として指定(エスケープ)

<?php
$ptr = "/a\./";

echo preg_match($ptr,"a."); //1 マッチする
echo preg_match($ptr,"aa"); //0 マッチしない
?>

2行目は、ドット(.)を文字として扱います。「a.」を指定しています。
エスケープとしてバックスラッシュ(ユニコードのU+005C)を前につけます。環境によっては円マークで表示されます。
ドット(.)にエスケープをつけない場合は任意の一文字という意味になります。

以下は、PHPマニュアルのpreg_match関数のリンクです。
http://php.net/manual/ja/function.preg-match.php

正規表現の主なパターン

正規表現の一覧表

主なパターン修飾子

以下は、主なパターン修飾子です。

オプション 説明
i 大文字も小文字もマッチする
u 対象文字列をUTF-8として扱う

以下は、PHPマニュアルのパターン修飾子のリンクです。
http://php.net/manual/ja/reference.pcre.pattern.modifiers.php

正規表現の ^ と $ は使わずに \A と \z を使う理由

正規表現の 先頭を表す^ と最後尾を表す$は使わずに \A と \z を使います。
理由は、 ^ と $の場合、データ末尾に改行が含まれていてもマッチ(1)を返してしまうからです。

以下は、サンプルです。

<?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 文字列を置換する(正規表現)

△上に戻る