Preg_replace错误使用非英语字符的regex,字符无法识别


preg_replace error with regex with non-english characters, character is not recognized

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

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

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

无法识别à字符;输出如下:ùûüÿ�âæçéèêëïîô

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


更新:我发现了以下帖子(preg_replace和中文字符的奇怪问题),其中将u添加到正则表达式的末尾可以纠正这样的问题:

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

这似乎修复了它,但有人能解释为什么这是发生在一个官方的解决方案,解释u在这个正则表达式做什么?

默认情况下,PHP regex引擎将您的字符串视为一组字节(即一组单个字节字符)。

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

  • 字符串被视为utf8字符串(因此字符最终被编码为多个字节)
  • 简写字符类(如's, 'w, 'd…)的含义更改为包含unicode字符而不仅仅是ascii字符。
注意,这两个更改也可以像这样显式地编写,在模式的开始,而不是使用u修饰符:
(*UTF8)(*UCP)yourpattern

您可以在这里找到PHP使用的pcre regex引擎的完整文档