如果第一个或最后一个字母在utf8中,则preg_match_all会失败

时间:2014-01-08 09:48:57

标签: php regex preg-match-all pcre

当我在字符串中搜索以utf-8字符开头/结尾的单词时,问题就开始了 - 它无法找到匹配项。如果单词开头/结尾没有utf-8字符,那么一切正常。 代码:

$str= 'String: ābols, abols, abŌls, abōls, aboļŠ, aboĻs';
$find = array('ābols', 'abols', 'abōls', 'aboļš', 'aboļs');
preg_match_all("/(*UTF8)\b(" . implode($find,"|") . ")\b/i",  $str, $matches);

结果你可以看到 - 以utf-8字符开头的“单词”无法找到: 结果图片:http://i.stack.imgur.com/qZku3.png

我做错了什么? 感谢。

1 个答案:

答案 0 :(得分:2)

您没有看到以“utf-8”字符开头(或结束)的单词的原因很简单:\b是一个单词边界,默认情况下是一个字符之间的限制(和仅来自\w(或[a-zA-Z0-9_])和另一个角色。

要更改\b的行为(要使其适用于星系的所有数字和所有字母),您必须使用u修饰符。使用此修饰符\w现在包含所有字母和所有数字:

preg_match_all("/(*UTF8)\b(" . implode($find,"|") . ")\b/iu",  $str, $matches);

另一种方法是用外观替换字边界:

preg_match_all("/(*UTF8)(?<=^|[\s\pP])(" . implode($find,"|") . ")(?=[\s\pP]|$)/i",  $str, $matches);