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