php - 如何将日语正则表达式与u标志匹配?

时间:2015-10-05 20:40:37

标签: php regex preg-match

当我向其提供以下字符串时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。

2 个答案:

答案 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