htmlentities()与htmlspecialchars()

Eri*_*gue 526 php

htmlspecialchars()和之间有什么区别htmlentities()?我什么时候应该使用其中一种?

Ars*_*nko 371

htmlspecialchars 可能用过了:

  1. 当不需要编码具有HTML等价物的所有字符时.

    如果您知道页面编码与文本特殊符号匹配,为什么要使用htmlentitieshtmlspecialchars非常简单,产生的代码更少,可以发送给客户端.

    例如:

    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;.
    //                ^                 ^
    
    Run Code Online (Sandbox Code Playgroud)

    第二个更短,如果设置了ISO-8859-1字符集,则不会引起任何问题.

  2. 当不仅通过浏览器处理数据时(为了避免解码HTML实体),

  3. 如果输出是XML(参见Artefacto的答案).

  • 如果你使用早于5.4的PHP版本,htmlspecialchars($ str,ENT_QUOTES,"UTF-8")是最好的.ENT_QUOTES是编码单引号的必要条件. (3认同)

Tho*_*ens 328

htmlentities的PHP文档:

此函数htmlspecialchars()在所有方面都是相同的,除了htmlentities()具有HTML字符实体等价物的所有字符都被转换为这些实体.

htmlspecialchars的PHP文档:

某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示.此函数返回一个字符串,其中包含一些转换; 所做的翻译是对日常网络编程最有用的翻译.如果需要翻译所有HTML字符实体,请htmlentities()改用.

不同之处在于编码.选择是所有(实体)或"特殊"字符,如&符号,双引号和单引号,小于和大于(specialchars).

我希望尽可能使用htmlspecialchars.

  • @Darius你所说的没有任何意义.只要为第三个参数指定"UTF-8",`htmlentities`和`htmlspecialchars`都可以处理UTF-8. (32认同)
  • 感谢您的回答,但是除了显而易见的差异之外,您是否愿意尽可能详细说明您喜欢什么`htmlspecialchars()`?什么情况下使用`htmlentities()`会导致问题,而`htmlspecialchars()`会不会? (31认同)
  • 因为使用htmlentities而不是htmlspecialchars而遇到了问题!如果你的网站是UTF8编码的,那么特殊的符号如"∞"会变成带有问号的黑色小钻石,因为htmlentities不知道如何处理它们,但htmlspecialchars确实如此. (16认同)
  • 从PHP 5.4开始,UTF-8是默认的编码选项(第三个参数). (14认同)
  • @Darius:我们碰到了类似的东西.像我们一样,你可能使用的是早于5.4.0的PHP.因此,根据Jonathan的评论推断,我们需要明确指定UTF-8:htmlentities($ str,ENT_QUOTES,'UTF-8'); (7认同)
  • @YevgeniyAfanasyev我明白你的意思,在最后的文本中它看起来似乎已经倒退了.但文档中引用的黄色文字更好地解释了它. (2认同)
  • 最后一部分措辞倒退的@ADyson来自Jannie Theunissen的最后一次编辑.最初的答案措辞正确.我将再次编辑以纠正. (2认同)

Art*_*cto 93

因为:

  • 有时您正在编写XML数据,并且您无法在XML文件中使用HTML实体.
  • 因为htmlentities替换的字符多于htmlspecialchars.这是不必要的,使PHP脚本效率降低,并且生成的HTML代码可读性降低.

htmlentities 仅当您的页面使用ASCII或LATIN-1等编码而不是UTF-8并且您使用与页面不同的编码处理数据时才需要.


小智 91

这是编码的htmlentities.

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

"&<>
¡¢£¤¥|§¨©ª«¬®¯°±²³'μ·¸¹º»¼½¾¿A A A A A AÆÇE E E E I I I I dñ○○○○○×○U U U U第yßA A A A A AæçE E E E I I I I dñ○○○○ö÷øU U U Uýþÿœœ ššŸƒ〜αβγδεζηθ ΙκλμνξΟπρστΥΦΧΨΩαβγδεζηθικλμνξοπρςστ υφχψωθΥπ - - '',"""†‡•...‰'"<>〜/€ℑℜ™ℵ←↑→↓↔↵⇐⇒⇒∀∀∂ ∃∅∇∈∉∋ΠΣ -*√α∞∠∧∨∩∪ ∫∴ 〜≅≈≠≡≤≥⊂⊃ ⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋⟨⟩◊♠♣♥♦

这是编码的htmlspecialchars.

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

"&<>

  • @Jonathan那些在列表中.如果您得到一个空结果,那么您可能错误地指定了编码. (8认同)
  • 谨防!乍一看,htmlentities看起来非常完整.但它缺少一堆真正基本和常见的角色(特别是如果你的客户喜欢MS).智能引号(例如,'或&rsquo;),破折号(例如, - 或&mdash),商标符号(™或&trade;)以及许多其他引号将使其返回null. (3认同)
  • 或者,您没有指定编码,而是依靠默认值,该默认值在PHP 5.4中进行了更改,然后(可能)在PHP 5.6中进行了更改,具体取决于您的配置。直到2012年,文档甚至都不建议您指定该参数。因此,如果您未指定* optional *第三个参数,并且未升级PHP,则htmlentities首先使用ISO-8859-1,然后使用UTF-8,然后使用php.ini中的所有内容,而不会在任何问题,但悄悄地什么也不返回。显然,这绝对不可能在某些时候导致数据丢失! (3认同)

Kme*_*ner 17

htmlspecialchars($strText, ENT_QUOTES)当您只希望字符串是XML和HTML安全时,您应该使用:

例如,编码

  • &to&
  • "到"
  • <to<
  • >到>
  • '到'

但是,如果您的文本中还有其他字符是Unicode或不常见的符号,那么您应该使用htmlentities()来确保它们在HTML页面中正确显示.

笔记:

  • '只会被htmlspecialchars()编码为' 如果传入ENT_QUOTES选项.' 然后使用更安全 因为旧版本的Internet Explorer不支持' 实体.
  • 从技术上讲,>不需要按照XML规范进行编码,但通常编码也是为了与<编码的要求保持一致.

  • 问题是:因为我的文本是由用户提供的,我不知道我是否有unicode或不常见的符号.为什么我应该在这种情况下使用htmlspecialchars? (2认同)

Eri*_*gue 13

我刚刚发现了这个get_html_translation_table功能.你传递它HTML_ENTITIESHTML_SPECIALCHARS它返回一个数组,其中包含将被编码的字符以及它们将如何编码.

  • 这对于您想要创建自己的功能很有用,例如替换一些额外的角色或做其他神奇的事情. (4认同)

gro*_*gel 11

htmlspecialchars ()进行最小量的编码以确保您的字符串不会被解析为HTML.这使得您的字符串比以前用于htmlentities ()编码具有编码的所有内容时更加人性化.


Jok*_*iro 8

htmlentities - 将所有适用的字符转换为HTML实体.

htmlspecialchars - 将特殊字符转换为HTML实体.

翻译在下面执行翻译字符:

  • '&'(&符号)变为'&'
  • '''(双引号)变为''''' 当没有设置ENT_NOQUOTES时.
  • "'"(单引号)成为''' (或')仅在设置了ENT_QUOTES时.
  • '<'(小于)成为'<'
  • '>'(大于)变为'>'

您可以查看以下代码,了解有关什么是htmlentities和htmlspecialchars的更多信息:

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


cic*_*cic 6

您可能希望使用某些Unicode字符编码,例如UTF-8和htmlspecialchars.因为没有任何需要为"所有[适用的字符"生成"HTML实体"(根据文档,这就是htmlentities所做的),如果它已经在你的字符集中.


N R*_*awa 5

htmlspecialchars() 和 htmlentities() 之间的差异非常小。让我们看一些例子:

htmlspecialchars

htmlspecialchars(string $string) 接受多个参数,其中第一个参数是字符串,所有其他参数(某些标志、某些编码等)都是可选的。htmlspecialchars 将字符串中的特殊字符转换为 HTML 实体。例如,如果您 的字符串中有 <br>htmlspecialchars会将其转换为< >. 而像 µ † 等字符在 HTML 中没有特殊意义。因此它们不会被htmlspecialchars函数转换为 HTML 实体,如下例所示。

echo htmlspecialchars('An example <br>'); // This will print - An example &lt; br &gt;
echo htmlspecialchars('µ †');             // This will print -  µ †
Run Code Online (Sandbox Code Playgroud)

html实体

htmlentities ( string $string )htmlspecialchars非常相似 ,它接受多个参数,其中第一个参数是一个字符串,所有其他参数都是可选的(某些标志、某些编码等)。与htmlspecialchars不同 ,htmlentities不仅将字符串中的特殊字符转换为 HTML 实体, 还将所有适用的字符转换为 HTML 实体。

echo htmlentities('An example <br>'); // This will print - An example &lt; br &gt;
echo htmlentities('µ †');             // This will print -  &micro; &dagger; 
Run Code Online (Sandbox Code Playgroud)