htmlentities () против htmlspecialchars () - PullRequest
515 голосов
/ 05 сентября 2008

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

Ответы [ 12 ]

370 голосов
/ 01 сентября 2010

htmlspecialchars может использоваться:

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

    Если вы знаете, что кодировка страницы соответствует специальным символам текста, зачем вам использовать htmlentities? 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 ).

319 голосов
/ 05 сентября 2008

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

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

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

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

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

Я предпочитаю использовать 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;.
    //                ^                 ^
91 голосов
/ 01 сентября 2010

Потому что:

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

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

87 голосов
/ 22 июня 2014

Это кодируется с htmlentities.

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

"& <>
¡¢ £ ¤ ¥ ¦ § ¨ © ª «¬ ® ¯ ° ± ² ³ ´ μ ¶ · ¸ ¹ º» ¼ ½ ¾ ¿À Á Â Ã Ä Å Æ Ç È É Ê Ë I I I I D Н О О О О Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é Цын í î ï ð ñ ò ö ö ö ö ÷ ø U U U ü ý þ ÿ Œ Š š š ƒ Γ Γ Γ Ε Ζ Δ Δ Ι Κ Λ Λ Ν Ξ Π Σ Σ Σ Φ Φ Ω Ω β β β β β β β λ λ μ μ τ υ φ χ ψ ω ϑ ϒ ϖ ‌ ‍ - - - - ”- - -” ””…… ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ℵ ↑ ↑ ↑ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇔ ⇒ ∇ ∂ ∃ ∇ ∇ ∈ ∇ ∋ ∏ - ∗ √ ∞ ∠ ∧ ∩ ∪ ∪ ∴ ≈ ≈ ≈ ≈ ≤ ≤ ≥ ⊃ ⊄ ⊆ ⊕ ⊥ ⋅ ⌉ ⌉ ⌊ ⌋ ⟨⟨ ⟩ ◊ ♠ ♣ ♥ ♦

Это кодируется с htmlspecialchars.

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

"& <>

16 голосов
/ 22 августа 2012

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

Например, кодировать

  • & to & amp;
  • "до"
  • <до & lt; </li>
  • > до & gt;
  • 'до'

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

Примечания:

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

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

11 голосов
/ 01 сентября 2010

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

7 голосов
/ 11 мая 2015

htmlentities - конвертирует все применимые символы в объекты HTML.

htmlspecialchars - конвертирует специальные символы в объекты HTML.

Переводы выполняются переводом символов ниже:

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

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

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

6 голосов
/ 05 сентября 2008

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

2 голосов
/ 02 февраля 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...