preg_replace пробел также ломает мои специальные символы

У меня есть строка, содержащая много пробелов и разрывов строк, которые я хотел бы очистить, поэтому я использую:

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

Однако, когда я вывожу $str, я замечаю, что специальные символы, такие как «à», превращаются в �.

Когда я удаляю preg_replace, � снова становится «à», но моя строка полна пробелов и разрывов строк.

Я попробовал Google (ofc), но, похоже, не многие люди сталкиваются с этой проблемой :)

Мои знания PHP находятся на среднем уровне, поэтому мне (все еще) не хватает понимания того, где может возникнуть эта проблема :)


person Pietjepuk    schedule 21.05.2013    source источник
comment
Ваша проблема может быть результатом плохой кодировки. Можете ли вы сказать мне, какую кодировку (UTF-8, ISO-8859-1 и т. д.) вы используете?   -  person Sven Rojek    schedule 21.05.2013
comment
Я использую UTF-8, но не уверен во всех своих данных. Я получаю содержимое $str через cURL.   -  person Pietjepuk    schedule 21.05.2013


Ответы (2)


может быть, что-то вроде этого может помочь, так как может быть проблема с кодировкой

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

вы получаете ввод utf-8?

person joz    schedule 21.05.2013
comment
Это работает, спасибо! Но означает ли это, что мой ввод не в правильной кодировке? Я имею в виду, это обходной путь, верно? Нужно ли мне менять входные данные ($str) или что-то с моей стороны? Получение содержимого $str через CURL с другого веб-сайта. - person Pietjepuk; 21.05.2013
comment
большинство веб-страниц не используют utf-8 или ISO-8859-1 в качестве кодировки .. (см. Заголовок), а utf-8 является (afaik) многобайтовой кодировкой и поэтому обрабатывается по-разному в php .. Однажды у меня была проблема с что при использовании базы данных ;D .. здорово, что я могу вам помочь ;D - person joz; 21.05.2013
comment
я не совсем уверен (никогда не использовал это), но, возможно, вы могли бы также работать с ссылка на замену ;D - person joz; 21.05.2013

У меня была такая же проблема. 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 );
person P_Enrique    schedule 17.11.2013
comment
Это все еще рвет мою струну, но вы даете мне надежду понять проблему - person Aminah Nuraini; 10.06.2016