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

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

我正在使用以下函数从字符串中删除 white-spaces:

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

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

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

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


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

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

这似乎可以解决问题,但有人可以解释为什么会发生这种情况,并提供官方解决方案来解释 u 在此正则表达式中的作用吗?

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

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

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

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

(*UTF8)(*UCP)yourpattern

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