Php удалить неразрывный пробел

Php удалить неразрывный пробел

Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы (&nbsp. По крайней мере, они именно так отображаются.

$section['name'] = strip_tags($section['name']); for($i=0;$i'name']);$i++) < echo dd($section['name'][$i]); >

В этом примере неразрывный пробел является одним символом. То есть, для даной строки ни str_replace, ни preg_replace по регулярному выражению ‘ ‘ ничего не меняет.

Здравствуйте, King Oleg, Вы писали:

KO>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы (&nbsp. По крайней мере, они именно так отображаются.

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>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы (&nbsp. По крайней мере, они именно так отображаются.

Здравствуйте, King Oleg, Вы писали:

KO>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы (&nbsp. По крайней мере, они именно так отображаются.

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>>Собственно, есть строка, которая берется из базы. Надо убрать из нее неразрывные пробелы (&nbsp. По крайней мере, они именно так отображаются.

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>Или здесь где-то грабли?
Граблей нет. Но мне нужно было оставить все остальные пробелы, кроме неразрывного.

Источник

Как убрать &nbsp (неразрывный пробел) с помощью php

Часто бывает, что информация, которую мы получаем из базы данных приходит к нам не совсем в том виде, в котором бы должна.

Из-за этого приходится обрабатывать пришедшие данные, чтобы получить необходимый результат. Ситуации бывают разные. Например, бывает, что нужно заменить определенные символы и слова на другие или обрезать пришедшую строку до определенного символа.

Сегодня поговорим о ситуации, когда строка приходит вроде бы с пробелами, но на самом деле вместо пробелов в коде вы увидите  . Это легко увидеть, если посмотреть на выводимую переменную в инспекторе кода любого браузера.

Зачем убирать закодированный неразрывный пробел

  – По сути является элементом компьютерной кодировки. Визуально на веб-странице он отображается как обычный пробел. Главное его отличие – это то, что   является неразрывным пробелом, а следовательно строка не разрывается.

Ну например, если мы захотим для какой-то строки использовать css свойство word-break, чтобы задать определенные правила переноса, то для строки с неразрывными пробелами это свойство сработает некорректно.

Убираем неразрывные пробелы из строки

Если информация приходит из базы данных, то на ум приходят 2 варианта: либо прошерстить базу и заменить неразрывные пробелы, либо исправить уже пришедшую строку.

Мы воспользуемся вторым вариантом. Сразу хочу сказать, что просто str_replace здесь не сработает. Нужно будет добавить в нашу формулу еще и htmlentities – которая преобразует все возможные символы в соответствующие html сущности.

Допустим, что мы получили из базы данных строку с неразрывными пробелами и сохранили ее в переменной my_text.

Тогда код для замены неразрывных пробелов на обычные будет выглядеть так:

Теперь в переменной $new_text у нас хранится обработанный текст.

Вот и всё. Надеюсь эта статья вам поможет. Делитесь в социальных сетях, оставляйте комментарии. Приятной работы 😉

Источник

php Удалить неразрывный пробел — non breaking space

vedro-compota's picture

Предположим что в некоторой 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 &nbsp schedule 21.11.2016

@georoot htmlentities предотвращает плохой вывод HTML (т. е. обеспечивает передачу информации, а не данных), XSS — это просто злонамеренно созданные плохие данные. — person user2864740 &nbsp schedule 21.11.2016

@ user2864740 именно моя точка зрения. Вы используете htmlentities , если хотите отображать в браузере, и в этом случае & nbsp не имеет никакого значения. Если вы не хотите отображать в браузере, функция не используется. — person georoot &nbsp schedule 21.11.2016

@georoot Информация в HTML и разная. Один — это пространство. Один — это неразрывное пространство. Кодируется только неразрывный пробел, а не обычный пробел. — person user2864740 &nbsp schedule 21.11.2016

Это не для отображения, а только для хранения в базе данных. Единственное решение, которое я могу придумать с банкоматом, — это htmlenitities ›str_replace› entity_decode chain — person Grzegorz &nbsp schedule 21.11.2016

@Grzegorz Используйте параметризованные запросы SQL для сохранения в базе данных. В любом случае входные данные уже содержат ненормальное пространство. — person user2864740 &nbsp schedule 21.11.2016

@Grzegorz в чем смысл использования Perl-выражений? Почему бы в этом случае не использовать str_replace? — person Victor Rudkov &nbsp schedule 21.11.2016

pastebin.com/raw/7eNT9sZr Вот строка, которую я хочу преобразовать в HTML. Замените несколько \ r \ n (которые делятся на \ xa0) и сделайте красивый html. — person Grzegorz &nbsp schedule 21.11.2016

Я думаю, он ищет способ удалить неразрывные пробелы из строки БЕЗ превращения их сначала в объекты HTML. — person simon &nbsp schedule 21.11.2016

В какой кодировке ваша строка? Это UTF-8? Если да, то я бы сказал, что там 0xc2a0 неразрывное пространство. — person David Ferenczy Rogožan &nbsp schedule 21.11.2016

Это utf8. Также пробовал \xc2a0 , ничего не работает, и мне интересно ПОЧЕМУ. Я хочу знать, как это работает, а не как это делать 🙂 — person Grzegorz &nbsp 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

Источник

Читайте также:  Sorted python compare function
Оцените статью