当我向其提供以下字符串时preg_match
发生了一些奇怪的事情。我正在使用'u'标志,因为我试图匹配混合日语字符串。
<?php
$subject="/hello/カメラ/";
$pattern='#^/hello/([\p{Han}\p{Katakana}\p{Hiragana}\w\-]+)/#u';
$result=preg_match($pattern,$subject);
echo $result; // 1
$subject="/hello/カレンダー/";
$pattern='#^/hello/([\p{Han}\p{Katakana}\p{Hiragana}\w\-]+)/#u';
$result=preg_match($pattern,$subject);
echo $result; // 0
?>
请注意,两个$ pattern变量具有相同的结构'/ hello / katakana /'。那么,为什么第一个$result
1和第二个0?
这是一个错误吗?
更新: 我在Mac上运行PHP版本5.5.24。
答案 0 :(得分:1)
非常感谢David Vartanian的帮助。
为了使正则表达式适用于这两种情况,我必须通过以下方式更新模式。
$pattern='#^/hello/([\x{30A0}-\x{30FF}\x{3040}-\x{309F}\x{4E00}-\x{9FBF}\w\-]+)/#u';
然而,看起来旧的模式适用于PHP 5.5.9和更新,如chris所述。
答案 1 :(得分:0)
您可以使用mb_ereg_match(),此功能尤其适用于多字节正则表达式,请勿与{0}弃用混淆。要使用它,只需删除分隔符和修饰符ereg_*
。
u