高亮显示非字母数字字符的单词


Highlight words with non alphanumeric characters

此代码

$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,文本是从mysql在utf-8

php中的'w仅基于ASCII。将其替换为Unicode字符属性'p{L},它将工作。

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

'p{L}是一个Unicode字符属性,匹配任何语言的任何类型的字母

'w也包含数字,如果你想这样,你需要创建自己的字符类,像这样:

['p{L}'d]

将匹配字母和数字

必须在pattern regex的末尾加上修饰符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]

模式修饰符可以看到这里