Мне нужно очистить строку, которая приходит (копировать / вставлять) из различных приложений Microsoft Office Suite ( Excel , Access и Word ), каждая из которых имеет свой собственный набор кодировок.
Я использую json_encode для целей отладки, чтобы иметь возможность видеть каждый отдельный кодированный символ.
Я могу очистить все, что я нашел до сих пор (\ r \ n), с str_replace, но с \ u00a0 мне не повезло.
$string = 'mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com'; //this is the output from json_encode $clean = str_replace("\u00a0", "",$string);
возвращает:
mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com
Это точно так же; он полностью игнорирует \ u00a0.
Есть ли способ обойти это? Кроме того, я чувствую, что я изобретаю колесо, есть ли функция / класс, которая полностью удаляет КАЖДЫЙ возможный символ КАЖДОЙ возможной кодировки?
____РЕДАКТИРОВАТЬ____
После первых двух ответов мне нужно уточнить, что мой пример работает, потому что это результат json_encode, а не фактическая строка!
Работает для меня, когда я копирую / вставляю код. Попробуйте заменить двойные кавычки на str_replace()
одиночными кавычками или избежать обратной косой черты ( "\\u00a0"
).
Объединив ord()
с substr()
в моей строке, содержащей \ u00a0, я нашел следующее проклятие для работы:
$text = str_replace( chr( 194 ) . chr( 160 ), ' ', $text );
У меня была такая же проблема. Очевидно, что json_encode PHP возвращает null для любой строки с «неразрывным пространством» в ней.
Решение состоит в том, чтобы заменить это на регулярное пространство:
str_replace(chr(160),' ');
Надеюсь, это помогает кому-то – мне понадобился час, чтобы понять.
Небольшая точка: \ u00a0 на самом деле является неразрывным символом пробела, cf http://www.fileformat.info/info/unicode/char/a0/index.htm
Поэтому было бы правильнее заменить его на ""
Вы должны сделать это с одинарными кавычками:
str_replace('\u00a0', "",$string);
Или, если вам нравится использовать двойные кавычки, вам нужно избежать обратной косой черты – это будет выглядеть так:
str_replace("\\u00a0", "",$string);
Этот тоже работает, я нашел где-то
$str = trim($str, chr(0xC2).chr(0xA0));
Это сделало трюк для меня:
$str = preg_replace( "~\x{00a0}~siu", " ", $str );