サンプルコード。


<?php
 
$list = [
  '12345',
  '1+2=3',
  '123abc',
  'abc123',
  '12345',
];
 
foreach($list as $x){
  $m1 = preg_match('/^[0-9]+/', $x);
  $m2 = mb_ereg_match('^[0-9]+', $x);
  $m3 = mb_ereg_match('^[0-9]+$', $x);
  $m4 = mb_ereg_match('^[0-90-9]+', $x);
  echo "\n";
  echo "preg_match('/^[0-9]+/', '$x') => [$m1] \n";
  echo "mb_ereg_match('^[0-9]+', '$x') => [$m2] \n";
  echo "mb_ereg_match('^[0-9]+$', '$x') => [$m3] \n";
  echo "mb_ereg_match('^[0-90-9]+', '$x') => [$m4] \n";
}
 
?>

実行結果。


$ php ./regex.php
 
preg_match('/^[0-9]+/', '12345') => [1] 
mb_ereg_match('^[0-9]+', '12345') => [1] 
mb_ereg_match('^[0-9]+$', '12345') => [1] 
mb_ereg_match('^[0-90-9]+', '12345') => [1] 
 
preg_match('/^[0-9]+/', '1+2=3') => [1] 
mb_ereg_match('^[0-9]+', '1+2=3') => [1] 
mb_ereg_match('^[0-9]+$', '1+2=3') => [] 
mb_ereg_match('^[0-90-9]+', '1+2=3') => [1] 
 
preg_match('/^[0-9]+/', '123abc') => [1] 
mb_ereg_match('^[0-9]+', '123abc') => [1] 
mb_ereg_match('^[0-9]+$', '123abc') => [] 
mb_ereg_match('^[0-90-9]+', '123abc') => [1] 
 
preg_match('/^[0-9]+/', 'abc123') => [0] 
mb_ereg_match('^[0-9]+', 'abc123') => [] 
mb_ereg_match('^[0-9]+$', 'abc123') => [] 
mb_ereg_match('^[0-90-9]+', 'abc123') => [] 
 
preg_match('/^[0-9]+/', '12345') => [0] 
mb_ereg_match('^[0-9]+', '12345') => [] 
mb_ereg_match('^[0-9]+$', '12345') => [] 
mb_ereg_match('^[0-90-9]+', '12345') => [1] 

PHPのドキュメントによると、

この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される値を返す可能性もあります。

とのこと。

preg_match と mb_ereg_match の両方ともそんな感じ。

だから空文字列 (=FLASEとして扱われる) が返ってくることがあるのか。

今回ためした環境は Mac OS X Mavericks + PHP 5.4


$ uname -mrsv
Darwin 13.2.0 Darwin Kernel Version 13.2.0: Thu Apr 17 23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64 x86_64
 
$ php --version
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

参考資料。

preg_match — 正規表現によるマッチングを行う

説明

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

pattern で指定した正規表現により subject を検索します。

PHP: preg_match - Manual
mb_ereg_match — マルチバイト文字列が正規表現に一致するか調べる

説明

bool mb_ereg_match ( string $pattern , string $string [, string $option = "msr" ] )

マルチバイト文字列に対する正規表現マッチングを行います。

PHP: mb_ereg_match - Manual

tags: php

Posted by NI-Lab. (@nilab)