Php preg_替换错误为带有非英语字符的正则表达式,字符无法识别

Php preg_替换错误为带有非英语字符的正则表达式,字符无法识别,php,regex,character-encoding,preg-replace,special-characters,Php,Regex,Character Encoding,Preg Replace,Special Characters,我使用以下函数删除字符串中的空格: $str = preg_replace('/\s+/', '', $str); 我正在输入这一串法语字符:ùÿÿÿ–æèèèî注意,每个字符之间都有一个空格 字符a无法识别;这就是输出的外观:ùÿ�æèèèèèèè 知道为什么吗?我曾经尝试过将str转换为UTF-8,但没有成功 更新:我发现了以下帖子(),其中将u添加到正则表达式的末尾可以纠正这样的问题: $str = preg_replace('/\s+/u', '', $str); 这似乎可以解决问

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

$str = preg_replace('/\s+/', '', $str);
我正在输入这一串法语字符:
ùÿÿÿ–æèèèî
注意,每个字符之间都有一个空格

字符a
无法识别;这就是输出的外观:
ùÿ�æèèèèèèè

知道为什么吗?我曾经尝试过将str转换为UTF-8,但没有成功


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

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

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

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

使用u修改器时,正则表达式引擎会更改两件事:

  • 字符串被视为utf8字符串(因此字符最终用多个字节编码)
  • 速记字符类(如
    \s
    \w
    \d
    ..)的含义将更改为包含unicode字符,而不仅仅是ascii字符
请注意,这两个更改也可以这样显式写入,在模式的开头,而不是使用u修饰符:

(*UTF8)(*UCP)yourpattern

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

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

使用u修改器时,正则表达式引擎会更改两件事:

  • 字符串被视为utf8字符串(因此字符最终用多个字节编码)
  • 速记字符类(如
    \s
    \w
    \d
    ..)的含义将更改为包含unicode字符,而不仅仅是ascii字符
请注意,这两个更改也可以这样显式写入,在模式的开头,而不是使用u修饰符:

(*UTF8)(*UCP)yourpattern

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

您的页面是UTF8格式的吗?在这里工作,…示例字符串是您的精确字符串吗?
u
是一个unicode修饰符。但是没有它它也行。。。或者至少在这里和
eval
上工作。是的,它是精确的字符串。该字符也通过电子邮件发送。您的页面是否为UTF8格式?在这里工作,…示例字符串是您的精确字符串吗?
u
是一个unicode修饰符。但是没有它它也行。。。或者至少在这里和
eval
上工作。是的,它是精确的字符串。这个角色也是通过电子邮件发送的。如果您想更深入地了解PCRE文档中关于
PCRE_UTF8
PCRE_UCP
的摘录,请参阅。您知道为什么这里的代码输出正确吗:但当我在计算机上运行它时,它输出不正确?我正在IIS 7.5、PHP 5.6.0上运行PHP,不确定这是否有区别。@user2704343:eval.in使用的libpcre可能在默认情况下被编译为使用UTF模式。您是否正确指定了输出编码(Try
内容类型:text/plain;charset=UTF-8
)?@user2704343:是,如果在浏览器中显示结果(或检查源代码),请尝试添加
。这将导致。如果您想更深入地了解PCRE文档中关于
PCRE_UTF8
PCRE_UCP
的摘录,请参阅。您知道为什么这里的代码输出正确吗:但当我在计算机上运行它时,它输出不正确?我正在IIS 7.5、PHP 5.6.0上运行PHP,不确定这是否有区别。@user2704343:eval.in使用的libpcre可能在默认情况下被编译为使用UTF模式。您是否正确指定了输出编码(Try
内容类型:text/plain;charset=UTF-8
)?@user2704343:是,如果在浏览器中显示结果(或检查源代码),请尝试添加