Intereting Posts
Преобразовать (вложенный) HTML-неупорядоченный список ссылок на массив ссылок PHP как изменить типы mime в MAMP Абсолютное положение и переполнение Как получить значение опции выбора html с помощью python в Google App Engine? Приведение элемента вперед с помощью CSS как я могу получить список стран из таблицы штатов, когда я выбираю страну из таблицы стран, используя раскрывающееся меню выбора? Добавление данных в базу данных MySQL из формы HTML Как установить высоту и ширину iframe на 100% Google Font (с пробелом на нем), а не рендеринг на IE7 / IE8 material-ui table: как внести изменения стиля в элементы таблицы Как получить изображение для выравнивания с левым набором параграфов / перейти вправо? Переполнение ячейки таблицы CSS игнорируется FF и Opera Существуют ли способы использования аддитивного смешивания цветов в веб-разработке? автоматически удаляет определенные символы из поля ввода во время ввода пользователем Обнаружение Нажмите на таблицу строк из созданной таблицы с помощью JQuery

htmlentities в PHP, но сохранение html-тегов

Я хочу преобразовать все тексты в строку в html-объекты, но сохраняя tags HTML, например:

Camión español

следует перевести на это:

 

Camión español

есть идеи?

    Вы можете получить список соответствий character => entity, используемый htmlentities , с функцией get_html_translation_table ; рассмотрите этот код:

     $list = get_html_translation_table(HTML_ENTITIES); var_dump($list); 

    (Возможно, вы захотите проверить второй параметр на эту функцию в руководстве – возможно, вам нужно будет установить значение, отличное от значения по умолчанию)

    Это даст вам что-то вроде этого:

     array ' ' => string ' ' (length=6) '¡' => string '¡' (length=7) '¢' => string '¢' (length=6) '£' => string '£' (length=7) '¤' => string '¤' (length=8) .... .... .... 'ÿ' => string 'ÿ' (length=6) '"' => string '"' (length=6) '<' => string '<' (length=4) '>' => string '>' (length=4) '&' => string '&' (length=5) 

    Теперь удалите соответствующие вам соответствия:

     unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); с unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); с unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); с unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); 

    Теперь ваш список имеет все атрибуты character =>, которые используются htmlentites, за исключением нескольких символов, которые вы не хотите кодировать.

    И теперь вам просто нужно извлечь список ключей и значений:

     $search = array_keys($list); $values = array_values($list); 

    И, наконец, вы можете использовать str_replace для замены:

     $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_out);

    И вы получаете:

     string '

    Camión español

    ' (length=84)

    Который выглядит так, как вы хотели 😉

    Edit: ну, кроме проблемы с кодировкой (черт побери UTF-8, я полагаю, я пытаюсь найти решение для этого и снова отредактировать)

    Второе редактирование через пару минут после: похоже, вам нужно будет использовать utf8_encode в списке $search , прежде чем вызывать str_replace 🙁

    Это означает использование чего-то вроде этого:

     $search = array_map('utf8_encode', $search); 

    Между вызовом array_keys и вызовом str_replace .

    И на этот раз вам действительно нужно получить то, что вы хотели:

     string '

    Camión español

    ' (length=70)

    И вот полная часть кода:

     $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $search = array_keys($list); $values = array_values($list); $search = array_map('utf8_encode', $search); $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_in, $str_out);
    с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $search = array_keys($list); $values = array_values($list); $search = array_map('utf8_encode', $search); $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_in, $str_out);
    с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $search = array_keys($list); $values = array_values($list); $search = array_map('utf8_encode', $search); $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_in, $str_out);
    с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $search = array_keys($list); $values = array_values($list); $search = array_map('utf8_encode', $search); $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_in, $str_out);
    с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $search = array_keys($list); $values = array_values($list); $search = array_map('utf8_encode', $search); $str_in = '

    Camión español

    '; $str_out = str_replace($search, $values, $str_in); var_dump($str_in, $str_out);

    И полный вывод:

     string '

    Camión español

    ' (length=58) string '

    Camión español

    ' (length=70)

    На этот раз это должно быть нормально ^^
    Это не очень подходит в одной строке, возможно, это не самое оптимизированное решение; но он должен работать нормально и имеет то преимущество, что вы можете добавить / удалить любой соответствующий символ => объект, который вам нужен, или нет.

    Повеселись !

    Не может быть ужасно эффективным, но он работает

     $sample = '

    Camión español

    '; echo htmlspecialchars_decode( htmlentities($sample, ENT_NOQUOTES, 'UTF-8', false) , ENT_NOQUOTES );

    Это оптимизированная версия принятого ответа.

     $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $string = strtr($string, $list); с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $string = strtr($string, $list); с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $string = strtr($string, $list); с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $string = strtr($string, $list); с $list = get_html_translation_table(HTML_ENTITIES); unset($list['"']); unset($list['<']); unset($list['>']); unset($list['&']); $string = strtr($string, $list); 

    Никакое решение, не содержащее синтаксический анализатор, будет правильным для всех случаев. Ваш хороший пример:

     

    Camión español

    но вы также хотите поддержать:

     

    true if 5 < a && name == "joe"

    где вы хотите, чтобы он появился как:

     

    true if 5 < a && name == "joe"

    Вопрос: Можете ли вы сделать кодировку ДО того, как вы создаете HTML. Другими словами, можно сделать что-то вроде:

     "

    " + htmlentities(inner) + "

    "

    Вы можете сэкономить много горя, если сможете это сделать. Если вы не можете, вам нужно каким-то образом пропустить кодировку <,> и “(как описано выше) или просто закодировать все, а затем отменить (например, replace('<', '<') )

    Это функция, которую я только что написал, которая решает эту проблему очень элегантно:

    Прежде всего, tags HTML будут извлечены из строки, затем htmlentities () выполняется на каждой оставшейся подстроке, после чего исходные HTML-tags будут вставлены в их старую позицию, что не приведет к чередованию HTML-тегов. 🙂

    Повеселись:

     function htmlentitiesOutsideHTMLTags ($htmlText) { $matches = Array(); $sep = '###HTMLTAG###'; preg_match_all("@<[^>]*>@", $htmlText, $matches); $tmp = preg_replace("@(<[^>]*>)@", $sep, $htmlText); $tmp = explode($sep, $tmp); for ($i=0; $i 

    Основываясь на ответе bflesch , я сделал некоторые изменения для управления строкой, содержащей less than sign , greater than sign и single quote или double quotes .

     function htmlentitiesOutsideHTMLTags ($htmlText, $ent) { $matches = Array(); $sep = '###HTMLTAG###'; preg_match_all(":]*>:i", $htmlText, $matches); $tmp = preg_replace(":]*>:i", $sep, $htmlText); $tmp = explode($sep, $tmp); for ($i=0; $i 

    Пример использования:

     $string = 'Is 1 < 4?è
    "then"

    gain some

    '; $string_entities = htmlentitiesOutsideHTMLTags($string, ENT_QUOTES | ENT_HTML401); var_dump( $string_entities );

    Выход:

     string 'Is 1 < 4?è
    "then"

    gain some

    ' (length=150)

    Вы можете передать любой ent flag согласно руководству htmlentities

    однострочное решение без таблицы перевода NO или пользовательской функции:

    Я знаю, что это старый вопрос, но мне недавно пришлось импортировать статический сайт на сайт WordPress и пришлось преодолеть эту проблему:

    вот мое решение, которое не требует использования таблиц перевода: htmlspecialchars_decode( htmlentities( html_entity_decode( $string ) ) );

    когда применяется к строке OP:

     

    Camión español

    вывод:

     

    Camión español

    когда применяется к строке Луки:

     Is 1 < 4?è
    "then"

    gain some

    вывод:

     Is 1 < 4?è
    "then"

    gain some

    EDIT: это особенно хорошо работает при «отбеливании» входной строки:

    $string = preg_replace( '/[^\x00-\x7F]/', null, $string ); htmlspecialchars_decode( htmlentities( html_entity_decode( $string ) ) );

    теперь строка $ sooo довольно!