preg_replace UTF-8不起作用

时间:2018-08-23 22:14:12

标签: php regex encoding preg-replace

我有以下代码可以在我的离线测试版本上正常工作,但在在线服务器上失败。

$names = "dimitris giannIs micHalis";
echo preg_replace("/s\b/", "w", mb_convert_case($names, MB_CASE_TITLE, "UTF-8"));

我得到的结果是Dimitriw Gianniw Michaliw

但是我有UTF-8而不是英文字符/单词。如果我将上面的示例按原样放置(英语),则可以正常工作,所以我猜我在用UTF-8做错了什么

1 个答案:

答案 0 :(得分:1)

通常(但请参见编辑下面的注释),您需要在正则表达式上使用u修饰符以使其能够使用UTF-8字符。例如

$words = "qθαεqθε γραεcισ cονσεcτε";
echo preg_replace("/ε\b/u", "α", mb_convert_case($words, MB_CASE_TITLE, "UTF-8"));

输出:

Qθαεqθα Γραεcισ Cονσεcτα

example在rextester上演示了u修饰符的用法(请注意,rextester不支持mb_convert_case,但实际上并不影响结果)。

修改

如@CasimiretHippolyte所指出的,默认情况下,可以使用--enable-unicode-properties选项编译PCRE扩展名(由PHP用于正则表达式)以处理Unicode字符。这可以解释离线测试版本和在线服务器上的结果之间的差异。