- Php удалить неразрывный пробел
- Как убрать   (неразрывный пробел) с помощью php
- Зачем убирать закодированный неразрывный пробел
- Убираем неразрывные пробелы из строки
- php Удалить неразрывный пробел — non breaking space
- Решение
- Key Words for FKN + antitotal forum (CS VSU):
- Как заменить декодированный неразрывный пробел (nbsp)
- Ответы (2)
- Объяснение проблемы
- Немного теории
- Решение
- Примечания
Php удалить неразрывный пробел
Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы ( . По крайней мере, они именно так отображаются.
$section['name'] = strip_tags($section['name']); for($i=0;$i'name']);$i++) < echo dd($section['name'][$i]); >
В этом примере неразрывный пробел является одним символом. То есть, для даной строки ни str_replace, ни preg_replace по регулярному выражению ‘ ‘ ничего не меняет.
Здравствуйте, King Oleg, Вы писали:
KO>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы ( . По крайней мере, они именно так отображаются.
KO>$section['name'] = strip_tags($section['name']); KO>for($i=0;$i'name']);$i++) < KO>echo dd($section['name'][$i]); KO>> KO>
KO>В этом примере неразрывный пробел является одним символом. То есть, для даной строки ни str_replace, ни preg_replace по регулярному выражению ‘ ‘ ничего не меняет.
Полечилось только так:
$section['name'] = preg_replace('/'.chr(160).'/', '', $section['name']);
Здравствуйте, King Oleg, Вы писали:
KO>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы ( . По крайней мере, они именно так отображаются.
Здравствуйте, King Oleg, Вы писали:
KO>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы ( . По крайней мере, они именно так отображаются.
KO>
KO>$section['name'] = strip_tags($section['name']); KO>for($i=0;$i'name']);$i++) < KO>echo dd($section['name'][$i]); KO>> KO>
KO>В этом примере неразрывный пробел является одним символом. То есть, для даной строки ни str_replace, ни preg_replace по регулярному выражению ‘ ‘ ничего не меняет.
Pattern Syntax
.
\s — any whitespace character
Здравствуйте, Ned1, Вы писали:
N>Здравствуйте, King Oleg, Вы писали:
KO>>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы ( . По крайней мере, они именно так отображаются.
KO>>
KO>>$section['name'] = strip_tags($section['name']); KO>>for($i=0;$i'name']);$i++) < KO>> echo dd($section['name'][$i]); KO>>> KO>>
KO>>В этом примере неразрывный пробел является одним символом. То есть, для даной строки ни str_replace, ни preg_replace по регулярному выражению ‘ ‘ ничего не меняет.
N>Pattern Syntax
N>.
N>\s — any whitespace character
N>Или здесь где-то грабли?
Граблей нет. Но мне нужно было оставить все остальные пробелы, кроме неразрывного.
Как убрать   (неразрывный пробел) с помощью php
Часто бывает, что информация, которую мы получаем из базы данных приходит к нам не совсем в том виде, в котором бы должна.
Из-за этого приходится обрабатывать пришедшие данные, чтобы получить необходимый результат. Ситуации бывают разные. Например, бывает, что нужно заменить определенные символы и слова на другие или обрезать пришедшую строку до определенного символа.
Сегодня поговорим о ситуации, когда строка приходит вроде бы с пробелами, но на самом деле вместо пробелов в коде вы увидите . Это легко увидеть, если посмотреть на выводимую переменную в инспекторе кода любого браузера.
Зачем убирать закодированный неразрывный пробел
– По сути является элементом компьютерной кодировки. Визуально на веб-странице он отображается как обычный пробел. Главное его отличие – это то, что является неразрывным пробелом, а следовательно строка не разрывается.
Ну например, если мы захотим для какой-то строки использовать css свойство word-break, чтобы задать определенные правила переноса, то для строки с неразрывными пробелами это свойство сработает некорректно.
Убираем неразрывные пробелы из строки
Если информация приходит из базы данных, то на ум приходят 2 варианта: либо прошерстить базу и заменить неразрывные пробелы, либо исправить уже пришедшую строку.
Мы воспользуемся вторым вариантом. Сразу хочу сказать, что просто str_replace здесь не сработает. Нужно будет добавить в нашу формулу еще и htmlentities – которая преобразует все возможные символы в соответствующие html сущности.
Допустим, что мы получили из базы данных строку с неразрывными пробелами и сохранили ее в переменной my_text.
Тогда код для замены неразрывных пробелов на обычные будет выглядеть так:
Теперь в переменной $new_text у нас хранится обработанный текст.
Вот и всё. Надеюсь эта статья вам поможет. Делитесь в социальных сетях, оставляйте комментарии. Приятной работы 😉
php Удалить неразрывный пробел — non breaking space
Предположим что в некоторой html форме возникают т.н. «неразрывные» пробелы (ну и вообще пусты символы которые вроде и не табы, но обычном trim-ом их не уберёшь) —
пусть мы получили содержимое формы с строку $phrase, тогда удалить эти пробелы можно таким способом:
Решение
$phrase = strtr($phrase, array_flip( get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, "UTF-8") ) ); $phrase = trim($phrase,chr(0xC2).chr(0xA0)); // удаляем "неразрывные пробелы"
вообще это мутная тема (особенно если вы не разбираетесь с кодировании символов ) — всё зависит от кодировки. надо разбираться. просто так использовать chr(160) — иначе в UTF-8 можно поудалять то, что не собирались) —
но можете изучить вот этот пример с сайта php.net:
// turn some HTML with non-breaking spaces into a "normal" string $myHTML = " abc"; $converted = strtr($myHTML, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES))); // this WILL NOT work as expected // $converted will still appear as " abc" in view source // (but not in od -x) $converted = trim($converted); // are translated to 0xA0, so use: $converted = trim($converted, "\xA0"); // > // UTF encodes it as chr(0xC2).chr(0xA0) $converted = trim($converted,chr(0xC2).chr(0xA0)); // should work // PS: Thanks to John for saving my sanity!
Key Words for FKN + antitotal forum (CS VSU):
Как заменить декодированный неразрывный пробел (nbsp)
Предположим, у меня есть жало, которое «a s d d» и htmlentities превращает его в
«a s d d» . Как заменить (используя preg_replace) его без кодирования в сущности? Я пробовал preg_replace(‘/[\xa0]/’, », $string); , но не работает. Я пытаюсь удалить эти специальные символы из своей строки, поскольку они мне не нужны Какие возможности помимо регулярного выражения? Изменить строку, которую я хочу проанализировать: http://pastebin.com/raw/7eNT9sZr
с функцией preg_replace(‘/[\r\n]+/’, «[##]», $text)
на потом implode(«
«, explode(«[##]», $text)) Мой вопрос не совсем в том, «как» это сделать (поскольку я мог кодировать сущности, удалять сущности, которые мне не нужны, и декодировать сущности). Но как их удалить с помощью str_replace или preg_replace.
htmlentities — это защита от xss. Если вы хотите отобразить в браузере, & nbsp будет оцениваться только как пробел. В противном случае функция не используется. — person georoot   schedule 21.11.2016
@georoot htmlentities предотвращает плохой вывод HTML (т. е. обеспечивает передачу информации, а не данных), XSS — это просто злонамеренно созданные плохие данные. — person user2864740   schedule 21.11.2016
@ user2864740 именно моя точка зрения. Вы используете htmlentities , если хотите отображать в браузере, и в этом случае & nbsp не имеет никакого значения. Если вы не хотите отображать в браузере, функция не используется. — person georoot   schedule 21.11.2016
@georoot Информация в HTML и разная. Один — это пространство. Один — это неразрывное пространство. Кодируется только неразрывный пробел, а не обычный пробел. — person user2864740   schedule 21.11.2016
Это не для отображения, а только для хранения в базе данных. Единственное решение, которое я могу придумать с банкоматом, — это htmlenitities ›str_replace› entity_decode chain — person Grzegorz   schedule 21.11.2016
@Grzegorz Используйте параметризованные запросы SQL для сохранения в базе данных. В любом случае входные данные уже содержат ненормальное пространство. — person user2864740   schedule 21.11.2016
@Grzegorz в чем смысл использования Perl-выражений? Почему бы в этом случае не использовать str_replace? — person Victor Rudkov   schedule 21.11.2016
pastebin.com/raw/7eNT9sZr Вот строка, которую я хочу преобразовать в HTML. Замените несколько \ r \ n (которые делятся на \ xa0) и сделайте красивый html. — person Grzegorz   schedule 21.11.2016
Я думаю, он ищет способ удалить неразрывные пробелы из строки БЕЗ превращения их сначала в объекты HTML. — person simon   schedule 21.11.2016
В какой кодировке ваша строка? Это UTF-8? Если да, то я бы сказал, что там 0xc2a0 неразрывное пространство. — person David Ferenczy Rogožan   schedule 21.11.2016
Это utf8. Также пробовал \xc2a0 , ничего не работает, и мне интересно ПОЧЕМУ. Я хочу знать, как это работает, а не как это делать 🙂 — person Grzegorz   schedule 21.11.2016
Ответы (2)
Объяснение проблемы
Причина, по которой он не работает, заключается в том, что вы неправильно указываете неразрывный пробел. Правильный код для неразрывного пробела в кодировке UTF-8 — 0xC2A0 , он состоит из двух байты — 0xC2 ( 194 ) и 0xA0 ( 160 ), поэтому технически вы указываете только половину кода символа.
Немного теории
Унаследованные кодировки символов использовали постоянное количество бит для кодирования каждого символа в своем наборе. Например, в исходной кодировке ASCII использовалось 7 бит на символ, 8 бит в расширенном ASCII. Кодировка UTF-8 — это так называемая кодировка символов переменной ширины, что означает, что количество битов, используемых для представления отдельных символов, является переменным, в случае UTF-8 коды символов состоят из одного вверх до четырех (8 бит) байтов (октетов). В целом, как и в случае кодирования Хаффмана, более часто используемые символы имеют более короткие коды, а более редкие символы имеют более длинные коды. Это помогает уменьшить размер данных среднего текста.
Решение
Вы можете заменить все вхождения неразрывного пробела UTF-8 в тексте, используя простой (и быстрый) str_replace или используя более гибкое регулярное выражение, в зависимости от ваших потребностей:
// faster solution $regular_spaces = str_replace("\xc2\xa0", ' ', $original_string); // more flexible solution $regular_spaces = preg_replace('/\xc2\xa0/', ' ', $original_string);
Примечания
Обратите внимание, что в случае str_replace необходимо использовать двойные кавычки ( » ) для заключения строки поиска, поскольку не понимает текстовое представление кодов символов, поэтому сначала нужно преобразовать эти коды в фактические символы. Это делается PHP автоматически, поскольку строки, заключенные в двойные кавычки, обрабатываются, а специальные последовательности (например, символ новой строки \n , текстовое представление кодов символов и т. Д.) Заменяются фактическими символами (например, 0x0A для \n в UTF-8) перед строкой значение уже используется. Напротив, сама функция preg_replace понимает текстовое представление кодов символов, поэтому вам не нужен PHP для преобразования их в реальные символы, и в этом случае вы можете использовать апострофы (одинарные кавычки, ‘ ) для заключения строки поиска.
Обратите внимание, что str_replace() также будет работать, но намного быстрее. — person simon; 21.11.2016