此代码
$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
答案 0 :(得分:1)
\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