【问题标题】:preg_replace error with regex with non-english characters, character is not recognizedpreg_replace 带有非英语字符的正则表达式错误,字符无法识别
【发布时间】:2025-12-10 19:05:01
【问题描述】:

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

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

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

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

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


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

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

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

【问题讨论】:

  • 你的页面是 UTF8 的吗?在这里工作,eval.in/447334 ...示例字符串是您的确切字符串吗?
  • u 是一个 unicode 修饰符,php.net/manual/en/reference.pcre.pattern.modifiers.php。没有它它也可以工作......或者至少在这里和eval..
  • 是的,它是确切的字符串。通过电子邮件发送的字符也很混乱。

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


【解决方案1】:

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

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

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

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

(*UTF8)(*UCP)yourpattern

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

【讨论】:

  • 这个。如果您想更深入地查看 PCRE 文档中关于 PCRE_UTF8PCRE_UCP 的摘录,请参阅 my answer here
  • 知道为什么代码在这里正确输出:eval.in/447341 但是当我在我的计算机上运行它时它输出不正确?我在 IIS 7.5、PHP 5.6.0 上运行 PHP,不确定这是否会有所不同。
  • @user2704343:有可能是eval.in使用的libpcre被编译为默认使用UTF模式。
  • 您是否正确指定了输出编码(试试Content-Type: text/plain; charset=utf-8)?
  • @user2704343:是的,如果您在浏览器中显示结果(或查看来源),请尝试添加<meta charset="UTF-8"/>