半角数字チェックのユニットテストをしてたらテストが失敗してしまう。原因をしらべたら全角数字を入力してんのに通っちゃってる。
で、手元の 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) | |
); |
どうやら以下のケースの場合に全角数字もOKになるぽい。
\d
(または [:digit:]
) を指定して、u
(PCRE_UTF8) 指定対処法は文字クラスを使わないで [0-9]
を使うこと。
良かれと思って u
指定してたのが返ってアダになった。直さないと...
------
つうか、1年以上前に気付いてる人がいた。