[PHP]PCRE正規表現のUTF-8モードにおける「d」の挙動

PHPで、PCRE正規表現の使用時に「u」オプションを指定すると、パターン文字列をUTF-8文字列として処理する「UTF-8モード」になります。

参考:PHP: 正規表現パターンに使用可能な修飾子 – Manual

UTF-8モードでは、「d」は半角数字以外の数字(全角数字等)にもマッチするようになります:

<?php
var_dump(preg_match('/d/', '1')); // int(0)
var_dump(preg_match('/d/u', '1')); // int(1) ※全角数字の「1」
var_dump(preg_match('/d/u', '๑')); // int(1) ※タイ文字の「1」
var_dump(preg_match('/d/u', '一')); // int(0) ※漢字の「1」はマッチしない

ただし、全角数字にマッチさせたいなら、文字クラス[0-9]の方が良いでしょう:

<?php
var_dump(preg_match('/[0-9]/', '123')); // int(1) ※全角数字にマッチしたいならこっち
var_dump(preg_match('/[0-90-9]/', '1')); // int(1) ※全角も半角もOK
var_dump(preg_match('/[0-90-9]/', '1')); // int(1) ※全角も半角もOK

dは想定外の「数字」にもマッチしてしまうため、使いどころが難しいと思います。

コメントを残す

コメントを残す