htmlentities () против htmlspecialchars ()

Каковы различия между htmlspecialchars() и htmlentities() . Когда следует использовать один или другой?

Из документации PHP для htmlentities :

Эта функция идентична htmlspecialchars() всеми способами, за исключением htmlentities() , все символы, имеющие эквиваленты сущности HTML, переводятся в эти сущности.

Из документации PHP для htmlspecialchars :

Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они должны сохранять их значения. Эта функция возвращает строку с некоторыми из сделанных преобразований; сделанные переводы являются наиболее полезными для повседневного веб-программирования. Если вам требуется перевести все символы HTML-символов, вместо этого используйте htmlentities() .

Разница в том, что кодируется. Выбор – это все (сущности) или все минус «специальные» символы, такие как амперсанды, двойные и одинарные кавычки, меньше и больше (специальные).

Я предпочитаю использовать htmlspecialchars когда это возможно.

Можно использовать htmlspecialchars :

  1. Когда нет необходимости кодировать все символы, имеющие свои эквиваленты HTML.

    Если вы знаете, что кодировка страницы соответствует текстовым специальным символам, почему вы используете htmlentities ? htmlspecialchars очень проста, и htmlspecialchars меньше кода для отправки клиенту.

    Например:

     echo htmlentities('<Il était une fois un être>.'); // Output: &lt;Il &eacute;tait une fois un &ecirc;tre&gt;. // ^^^^^^^^ ^^^^^^^ echo htmlspecialchars('<Il était une fois un être>.'); // Output: &lt;Il était une fois un être&gt;. // ^ ^ 

    Второй – короче и не вызывает проблем, если установлена ​​кодировка ISO-8859-1.

  2. Когда данные будут обрабатываться не только через браузер (чтобы избежать декодирования HTML-объектов),

  3. Если выход – XML ​​(см. Ответ Artefacto ).

Потому как:

  • Иногда вы пишете XML-данные, и вы не можете использовать HTML-объекты в XML-файле.
  • Поскольку htmlentities заменяет больше символов, чем htmlspecialchars . Это необязательно, делает скрипт PHP менее эффективным и полученный HTML-код менее читабельным.

htmlentities необходимо, только если ваши страницы используют кодировки, такие как ASCII или LATIN-1 вместо UTF-8, и вы обрабатываете данные с кодировкой, отличной от страницы.

Это кодируется с помощью htmlentities .

implode( array_values( get_html_translation_table( HTML_ENTITIES ) ), "\t" ) :

"& <>
¡¢ £ ¤ ¥ | § ¨ © ª «¬ ® ¯ ° ± ² ³ 'μ ¶ · ¸ ¹ º» ¼ ½ ¾ ¿À Á Â Ã Ä Å Ç È É Ê Ë Ì Í Ï Ï Ñ Ò Ò Ó Ô Õ Ö × Ø Ú Ú Û Ý Ý ß ß á â â ä å æ ç è è ò ò í í ð ð ð ò ò õ õ ÷ ø Œ ú ú ü ü Ÿ ÿ Œ Œ Œ ƒ ƒ ƒ ƒ ƒ ~ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω θ Υ π – – '', "" "† ‡ • … ‰ '" <> ~ / € ℑ ℘ ℜ ™ ℵ ← ↑ → ↓ ↔ ↵ ⇐ ⇒ ⇒ ⇓ ⇔ ∀ ∂ ∃ ∅ ∇ ∈ ∉ ∋ Π Σ – * √ α ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ≅ ≈ ≈ ≠ ≡ ≤ ≥ ≥ ≥ ⊃ ⊃ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥

Это кодируется с помощью htmlspecialchars .

implode( array_values( get_html_translation_table( HTML_SPECIALCHARS ) ), "\t" ) :

"& <>

Вы должны использовать htmlspecialchars($strText, ENT_QUOTES) когда вы просто хотите, чтобы ваша строка была безопасна для XML и HTML:

Например, гостиницы

  • & to & amp;
  • "to & quot;
  • & lt;
  • > to & gt;
  • 'to & # 039;

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

Заметки:

  • 'будет только кодироваться htmlspecialchars () до & # 039; если включена опция ENT_QUOTES. & # 039; более безопасно использовать, поскольку более старые версии Internet Explorer не поддерживают " организация.
  • Технически> не нужно кодировать в соответствии со спецификацией XML, но обычно кодируется для соответствия требованиям <encoded.

Я только что узнал о функции get_html_translation_table . Вы передаете ему HTML_ENTITIES или HTML_SPECIALCHARS и он возвращает массив с символами, которые будут закодированы и как они будут закодированы.

htmlspecialchars () делает минимальный размер кодировки, чтобы убедиться, что ваша строка не анализируется как HTML. Это делает вашу строку более понятной для человека, чем если бы вы использовали htmlentities () для кодирования абсолютно всего, что имеет кодировку.

Вероятно, вы хотите использовать кодировку символов Unicode, например UTF-8 и htmlspecialchars. Потому что нет необходимости генерировать «HTML-сущности» для «всех [применимых символов» (то есть, что делает htmlentities в соответствии с документацией), если оно уже находится в вашем наборе символов.

htmlentities – преобразовать все применимые символы в объекты HTML.

htmlspecialchars – Преобразование специальных символов в объекты HTML.

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

  • '&' (амперсанд) становится '& amp;'
  • '' '(двойная кавычка) становится "& quot;" когда ENT_NOQUOTES не установлен.
  • «'» (одинарная кавычка) становится «& # 039;» (или ') только при установке ENT_QUOTES.
  • '<' (меньше) становится '& lt;'
  • '>' (больше) становится '& gt;'

Вы можете проверить следующий код для получения дополнительной информации о том, что такое htmlentities и htmlspecialchars:

https://gist.github.com/joko-wandiro/f5c935708d9c37d8940b

Один небольшой пример: мне нужно было иметь 2 имени клиента, индексированные в функции:

 [1] => Altisoxxce Soluxxons S.à rl [5] => Joxxson & Joxxson 

Я первоначально $term = get_term_by('name', htmlentities($name), 'client'); что привело к именам терминов, которые включали только элемент массива амперсанда (&), но не акцентированный элемент. Но когда я изменил настройку переменной на htmlspecialchars они смогли запустить функцию. Надеюсь это поможет!