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

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

目次

説明 preg_match関数
サンプル 文字列を検索する
  文字をORで検索する
  文字を否定で検索する
  文字を範囲で指定して検索する
  先頭の文字列を検索する
  文字列の最後尾を検索する
  連続する文字を指定して検索する
  5桁の半角数値かをチェックする
  5桁の半角数値または英字の小文字(a-f)かをチェックする
  郵便番号の数値と桁数とハイフンをチェックする
パターン 正規表現の主なパターン
  主なパターン修飾子
参考 正規表現の ^ と $ は使わずに \A と \z を使う理由

preg_match関数

int preg_match ( 正規表現のパターン ,  検索対象の文字列 [, 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
?> 

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

文字をORで検索する

文字を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」があるかを指定しています。
4,5行目は1に、6行目は0になります。

文字を否定で検索する

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

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

echo preg_match($a,"ZZZ"); //1
echo preg_match($a,"ZAA"); //1
echo preg_match($a,"AAA"); //0
?> 

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

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

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

<?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」の文字があるか指定しています。
4,5行目は、指定の文字があるので1になります。
6行目は、指定の文字がないので0になります。

先頭の文字列を検索する

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

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

echo preg_match($a,"ZXC"); //1
echo preg_match($a,"AZX"); //0
?> 

3行目は、正規表現で「ZX」が先頭にあるかを指定しています。uは文字列をUTF-8として扱います。
5行目は、指定の文字があるので1になります。
6行目は、指定の文字がないので0になります。
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として扱います。
5行目は、指定の文字があるので1になります。
6行目は、指定の文字がないので0になります。
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回連続することを指定しています。
4,5行目は、指定の文字があるので1になります。
6行目は、指定の文字がないので0になります。

5桁の半角数値かをチェックする

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桁の半角数値を指定しています。
4行目は、数値5桁のため1になります。
5行目は、数値以外の文字があるので0になります。
6行目は、5桁ではないため0が返ります。

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

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)を指定しています。
4行目は、マッチするので1を返します。
5行目は、4桁なので0を返します。
6行目は、数値のみですがヒットします。
7行目は、英字のみですがヒットします。

郵便番号の数値と桁数とハイフンをチェックする

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

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

2行目は、正規表現で郵便番号の数値と桁数とハイフンを指定しています。
\dは、数値を意味します。[0-9]と同じです。

正規表現の主なパターン

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

パターン パターンの意味
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)

△上に戻る