【问题标题】:preg_replace whitespace also breaks my special characterspreg_replace 空格也破坏了我的特殊字符
【发布时间】:2013-05-16 01:56:22
【问题描述】:

我有一个包含大量空格和换行符的字符串,我想清理它们,所以我使用:

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

但是,当我回显 $str 时,我注意到像“à”这样的特殊字符变成了 ...。

当我删除 preg_replace 时, � 再次变为“à”,但我的字符串充满了空格和换行符。

我尝试了 Google (ofc),但似乎没有很多人遇到这个问题 :)

我对 PHP 的了解是中级的,所以我(仍然)有点缺乏对这个问题可能发生在哪里的洞察力 :)

【问题讨论】:

  • 您的问题可能是由于编码错误造成的。您能告诉我您使用的是什么编码(UTF-8、ISO-8859-1 等)吗?
  • 我使用的是 UTF-8,但我不确定我的所有数据。我通过 cURL 收到 $str 的内容。

标签: preg-replace special-characters whitespace line-breaks


【解决方案1】:

我也遇到了同样的问题。 preg_replace 将破坏一个 UTF-8 字符串,如果它具有以下字符之一(在此仅提及一些更常见的情况):

(U+00E0) : à Latin small letter a with grave
(U+0160) : Š Latin capital letter s with caron
(U+03A0) : Π Greek capital letter pi
(U+0420) : Р Cyrillic capital letter er

答案是使用 UTF-8 模式修饰符。有一个问题:UTF-8 可以包含\s 无法捕获的空白字符。所以你必须在你的模式中添加\p{Z},这匹配所有的空格。所以使用:

$str = preg_replace( '/[\p{Z}\s]+/u', ' ', $str );

【讨论】:

  • 它仍然破坏了我的字符串,但你给了我理解问题的希望
【解决方案2】:

也许这样的事情会有所帮助,因为字符集可能有问题

$text = utf8_decode($text);
$text = trim(preg_replace('/\s+/', ' ', $text));
$text = utf8_encode($text);

你得到 utf-8 输入了吗?

【讨论】:

  • 这行得通,谢谢!但这是否意味着我的输入不是正确的字符集?我的意思是,这是一种解决方法,对吗?我是否需要更改我的输入数据 ($str) 或其他东西?从另一个网站接收 $str 槽 CURL 的内容。
  • 没有大多数网页使用 utf-8 或 ISO-8859-1 作为字符集 ..(请参阅标题)并且 utf-8 是(afaik)多字节编码,因此在 php 中的处理方式不同..我曾经在使用数据库时遇到过这个问题;D..太好了,我可以帮助你;D
  • 我不太熟悉(从未使用过这个),但也许您也可以使用 link 替换 ;D
猜你喜欢
  • 2019-03-26
  • 2015-02-18
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多