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}$ 5桁の半角数値を指定
^[0-9a-f]{5}$ 5桁の半角数値または英字の小文字(a-f)を指定
^[0-9]{3}-[0-9]{4}$ 郵便番号を指定(数値3桁とハイフンと数値4桁)
エスケープ ドット(.)を文字として指定(エスケープ)
パターン 正規表現の主なパターン
  主なパターン修飾子
参考 正規表現の ^ と $ は使わずに \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桁以上とハイフン(-)を指定しています。

5桁の半角数値を指定

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

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

2行目は、5桁の半角数値を指定しています。

5桁の半角数値または英字の小文字(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 マッチする 英字のみ
?> 

2行目は、5桁の半角数値または英字の小文字(a-f)を指定しています。

郵便番号を指定(数値3桁とハイフンと数値4桁)

<?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桁とハイフンと数値4桁)を指定しています。
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

正規表現の主なパターン

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

パターン パターンの意味
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か。
T\z 最後尾の文字はTか。
* *の直前の文字が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 を使います。
理由は、 ^ と $の場合、データ末尾に改行が含まれていてもマッチ(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/preg_replace)

△上に戻る