当前位置: 首页 > 面试题库 >

html_entity_decode上的ENT_HTML5,ENT_HTML401,…修饰符有什么作用?

田曜瑞
2023-03-14
问题内容

自php 5.4起 html_entity_decode 引入了四个新标志,并带有最少的解释

ENT_HTML401 Handle code as HTML 4.01.
ENT_XML1    Handle code as XML 1.
ENT_XHTML   Handle code as XHTML.
ENT_HTML5   Handle code as HTML 5.

我想了解他们的目的。在哪些情况下有意义?

我的猜测(但我可能错了)是,任何不同的标准都对一些不寻常的字符进行编码,而对其他字符则没有,因此为了尊重它们,它们在这里。

我的研究: htmlentities 具有相同的基本解释,也没有示例。我没有运气谷歌。


问题答案:

当我在htmlspecialchars页面上看到这些常量时,我​​开始怀疑这些常量的行为。该文档是垃圾,因此我开始研究PHP的源代码。

基本上,这些常数会影响某些实体是否已编码(或解码html_entity_decode)。最明显的影响是撇号(')是编码为'(for
ENT_HTML401)还是'(for
other)。同样,它确定使用时是否'已解码html_entity_decode。('始终被解码)。

所有用法都可以在ext / standard / html.c及其头文件中找到。从ext / standard / html.h:

#define ENT_HTML_DOC_HTML401            0
#define ENT_HTML_DOC_XML1                       16
#define ENT_HTML_DOC_XHTML                      32
#define ENT_HTML_DOC_HTML5                      (16|32)

(替换ENT_HTML_DOC_ENT_得到他们的PHP常量名)

我开始寻找这些常量的所有出现情况,并且可以就ENT_*常量的行为共享以下内容:

  • 它影响哪些数字实体将被解码或不被解码。例如,被解码为不可读/无效字符ENT_HTML401,和ENT_XHTMLENT_XML1。对于ENT_HTML5然而,这被视为无效字符,因此它停留。(C函数unicode_cp_is_allowed)
  • ENT_SUBSTITUTE启用,无效的代码单元序列中 用于一个指定的字符集 被替换。(不取决于文档类型!)
  • ENT_DISALLOWED启用,代码点 被禁止指定文档类型 将被替换。(不取决于字符集!)
  • 使用ENT_IGNOREENT_SUBSTITUTE删除相同的无效代码单元序列,并且不进行替换(例如,取决于“文档类型”的选择ENT_HTML5
  • 禁止
ENT_HTML5(线976)
  • ENT_XHTML与共享实体图ENT_HTML401。唯一的区别是'它将转换为单引号,ENT_XHTMLwhile ENT_HTML401不会将其转换(请参见此行)
  • ENT_HTML401ENT_XHTML使用完全相同的实体图(减去上一点的差异)。ENT_HTML5使用自己的地图。其他(目前ENT_XML1)具有非常有限的解码图(>&<'"和它们的数字等同物)。(请参见C函数unescape_inverse_map)
  • 关于前一点的注意事项:当仅几个实体必须转义(认为htmlspecialchars)时ENT_XML1,除之外,所有实体映射将使用与相同的实体ENT_HTML401。那一个不会用',但是'

这几乎涵盖了所有内容。我不会列出所有实体差异,而是要针对一些包含以下内容的文本文件指向https://github.com/php/php-
src/tree/php-5.4.11/ext/standard/html_tables
每种类型的映射。

当使用htmlspecialchars与ENT_COMPAT(默认)或ENT_NOQUOTES,这不要紧,你挑(见下文)之一。我在SO上看到了一些答案,可以归结为:

<input value="<?php echo htmlspecialchars($str, ENT_HTML5);?>" >

这是 不安全的 。它将覆盖默认值ENT_HTML401 | ENT_COMPAT,其具有的区别在于HTML5实体使用,但
认为引号不再逃脱!另外,这是冗余代码。必须由被编码的实体htmlspecialchars是所有相同的ENT_HTML401ENT_HTML5

只需使用ENT_COMPATENT_QUOTES代替。当您对属性使用撇号(value='foo')时,后者也适用。如果您只有的两个参数htmlspecialchars,则不要包含任何参数,因为它是默认参数(ENT_HTML401为0,还记得吗?)。

如果要在页面上打印某些内容(在标签之间,而不是属性之间),则选择哪一个都没有关系,因为它具有相同的效果。使用ENT_NOQUOTES | ENT_HTML401等于数字值甚至足够0

另请参阅以下有关ENT_SUBTITUTE和ENT_DISALLOWED的信息。

我应该为htmlentities使用哪个ENT_ *?

如果您的文本编辑器或数据库太笨拙,以致您不能包含非US-
ASCII字符(例如UTF-8),则可以使用htmlentities。否则,请保存一些字节并改用htmlspecialchars(请参见上文)。

无论您需要使用ENT_HTML401ENT_HTML5或别的东西取决于你的页面是如何提供服务。当您有HTML5页面(<!doctype html>)时,请使用ENT_HTML5。XHTML或XML?使用相应的ENT_XHTMLENT_XML1。如果没有doctype或纯HTML4,请使用ENT_HTML401(省略时是默认值)。

我应该使用ENT_DISALLOWED,ENT_IGNORE还是ENT_SUBSTITUTE?

默认情况下,将删除 对给定字符集无效的
字节序列。要代替无效的字节序列,请指定ENT_SUBSTITUTE。(请注意,这&#FFFD;是针对非UTF-8字符集显示的)。ENT_IGNORE但是,当您指定时,即使指定,也不会显示这些字符ENT_SUBSTITUTE

指定时, 文档类型的
无效字符将被上述相同的替换字符(或其实体)替换ENT_DISALLOWED。无论是否进行ENT_IGNORE设置,都会发生这种情况(这与文档类型的无效字符无关)。



 类似资料:
  • 问题内容: 我知道这不仅适用于Java,而且适用于许多语言,但这是我最熟悉的语言。 我了解修饰符的作用以及如何使用它们。我只想知道,为什么我们需要它们?为什么每个对象都无法访问,无论是否需要访问? 问题答案: 当您必须维护更大的项目时,原因变得更加明显。当方法或变量是公共的时,对它进行更改时必须小心,因为您永远不知道代码库的哪些部分依赖于它的确切行为。 但是,当变量或方法是私有的时,您会知道该变量

  • 问题内容: 我对php中的访问修饰符完全感到困惑。关于访问修饰符的内存利用率是否存在任何差异,或仅具有可访问性的差异。请提出建议。如果我有以下代码: 现在谁能告诉我,在变量或函数上方将发生多少内存。 问题答案: 不,访问修饰符对Java或PHP或我所听说的任何其他语言的运行时内存利用率均无影响。 可能由于某些字节码中的访问修饰符(取决于编码方式),代码大小可能会增加几个字节。您的程序在其他方面必须

  • 本文向大家介绍使用Python打开文件时,“ b”修饰符有什么作用?,包括了使用Python打开文件时,“ b”修饰符有什么作用?的使用技巧和注意事项,需要的朋友参考一下 'b'修饰符打开以二进制模式指定的文件。“二进制”文件是格式不由可读字符组成的任何文件。二进制文件的范围可以是图像文件(例如JPEG或GIF),音频文件(例如MP3)或二进制文档格式(例如Word或PDF)。在Python中,默

  • 本文向大家介绍使用Python打开文件时,“ U”修饰符有什么作用?,包括了使用Python打开文件时,“ U”修饰符有什么作用?的使用技巧和注意事项,需要的朋友参考一下 在具有通用换行符支持的Python中,mode参数也可以是“ U”,表示“打开以通用换行符解释的文本文件形式输入”。这是跨平台支持所必需的,因为Unix os上的换行用单个字符\ n表示,而Windows上的换行用2个字符\ r

  • 为什么字段resultsqueue的修饰符重复?即使当我将resultQueue名称更改为每隔一个名称时,仍然会得到这个错误。当我在main函数中移动resultsQueue时,我不会得到这个错误。 这是我的代码:

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只