preg_replace空格也打破了我的特殊字符

时间:2013-05-21 10:20:52

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

我有一个字符串,其中包含很多我要清理的空格和换行符,所以我使用:

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

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

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

我试过谷歌(ofc),但并不是很多人似乎遇到了这个问题:)

我对PHP的了解是中级的,所以我(仍然)对这个问题可能发生的地方缺乏了解:)

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。 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 );

答案 1 :(得分:0)

这样的事情可能有所帮助,因为charset可能存在问题

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

你得到utf-8输入吗?