带有非英语字符的正则表达式的preg_replace错误,无法识别字符

时间:2015-10-08 19:44:50

标签: php regex character-encoding preg-replace special-characters

我正在使用以下函数从字符串中删除空格:

$str = preg_replace('/\s+/', '', $str);

我正在输入这个法语字符串:ù û ü ÿ à â æ ç é è ê ë ï î ô通知每个都有一个空格。

无法识别à字符;这是输出的外观:ùûüÿ�âæçéèêëïîô

知道为什么吗?我曾尝试将str转换为UTF-8,但无济于事。

更新:我发现以下帖子(Weird problem with preg_replace and chinese character),其中在正则表达式末尾添加u可以纠正问题,如下所示:

$str = preg_replace('/\s+/u', '', $str);

这似乎解决了这个问题,但是有人可以解释为什么会发生这种情况以及解释u在这个正则表达式中正在做什么的官方解决方案吗?

1 个答案:

答案 0 :(得分:4)

默认情况下,PHP正则表达式引擎会将您的字符串视为一个字节(即一个字节字符)。

使用u修饰符时,正则表达式引擎会改变两件事:

  • 字符串被视为utf8字符串(因此字符最终被编码为多个字节)
  • 速记字符类(如\s\w\d ...)的含义更改为包含unicode字符,而不仅包含ascii字符。

请注意,这两个更改也可以在模式的开头显式编写,而不是使用u修饰符:

(*UTF8)(*UCP)yourpattern

您可以找到PHP here使用的pcre正则表达式引擎的完整文档。