0

这段代码

$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

4

2 回答 2

1

\w在 php 中仅基于 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]

这将匹配字母和数字。

于 2013-02-28T21:13:27.217 回答
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]

你可以在这里看到模式修饰符

于 2013-02-28T21:10:31.320 回答