突出显示非字母数字字符的单词

时间:2013-02-28 19:07:09

标签: php regex utf-8 preg-replace

此代码

$text = 'xxx AA BB xxx xäxAAx xBBBxóx ';
$words = array('AA BB', 'AA','BB');
$text = preg_replace('/(\w*('.implode("|",$words).')\w*)/i', '[b]$1[/b]', $text);

返回

xxx [b]AA BB[/b] xxx xä[b]xAAx[/b] [b]xBBBx[/b]óx

如何修改接收

xxx [b]AA BB[/b] xxx [b]xäxAAx[/b] [b]xBBBxóx[/b]

问题是非字母数字字符,文件是utf-8,文本来自utf-8中的mysql

2 个答案:

答案 0 :(得分:1)

php中的

\w仅基于ASCII。将其替换为Unicode字符属性\p{L},它将起作用。

 $text = preg_replace('/(\p{L}*('.implode("|",$words).')\p{L}*)/ui', '[b]$1[/b]', $text);

\p{L}Unicode character property,与任何语言的任何类型的字母匹配

\w也包含数字,如果你需要,你需要创建自己的角色类:

[\p{L}\d]

这会匹配字母和数字。

答案 1 :(得分:0)

您必须在模式正则表达式的末尾添加修饰符u

$text3 = preg_replace('/(\w*('.implode("|",$words).')\w*)/iu', '[b]$1[/b]', $text);

得到:

xxx [b]AA BB[/b] xxx [b]xäxAAx[/b] [b]xBBBxóx[/b]

模式修饰符可以看到Here