犬ターネット

preg_match で文字クラスに \d を指定すると全角数字が通ってしまうケースがある

2013-11-19 php 正規表現

半角数字チェックのユニットテストをしてたらテストが失敗してしまう。原因をしらべたら全角数字を入力してんのに通っちゃってる。

で、手元の PHP5.3.10, PHP5.4.21 で調べたら以下のような結果になった。

<?php
var_dump(
preg_match( '/\A[\d]+\z/u', '1' ), // int(1)
preg_match( '/\A[\d]+\z/u', '1' ), // int(1)
preg_match( '/\A[\d]+\z/', '1' ), // int(1)
preg_match( '/\A[\d]+\z/', '1' ), // int(0)
preg_match( '/\A[0-9]+\z/u', '1' ), // int(1)
preg_match( '/\A[0-9]+\z/u', '1'), // int(0)
preg_match( '/\A[0-9]+\z/', '1' ), // int(1)
preg_match( '/\A[0-9]+\z/', '1' ) // int(0)
);
view raw preg_test.php hosted with ❤ by GitHub

どうやら以下のケースの場合に全角数字もOKになるぽい。

対処法は文字クラスを使わないで [0-9] を使うこと。

良かれと思って u 指定してたのが返ってアダになった。直さないと...

------

つうか、1年以上前に気付いてる人がいた。

PHP での PCRE 正規表現の \w や \d について - A Day in Serenity @ kenjis


白濁

鎮火