使用 htmlspecialchars 转义双引号时,为什么使用 ENT_SUBSTITUTE 时需要 ENT_QUOTES?

when using htmlspecialchars to escape double-quotes, why is ENT_QUOTES required when using ENT_SUBSTITUTE?

我在 php 版本 7.0.3 中使用 htmlspecialchars 时注意到以下行为:

php > echo htmlspecialchars('"');
"
php > echo htmlspecialchars('"', ENT_SUBSTITUTE);
"
php > echo htmlspecialchars('"', ENT_QUOTES | ENT_SUBSTITUTE);
"

我们想在使用 ENT_SUBSTITUTE 标志的同时转义双引号。请注意,仅使用 ENT_SUBSTITUTE 标志时,双引号不会被转义。

如果我们想转义双引号,ENT_SUBSTITUTE 是否需要 ENT_QUOTES 标志?这是为什么?

documentation for htmlspecialchars并没有说使用ENT_SUBSTITUTE时需要ENT_QUOTES。事实上,它似乎暗示相反——双引号应该总是被转义,除非 ENT_NOQUOTES 标志存在。

当您显式将标志传递给 htmlspecialchars 时,您 替换默认标志 ​​

htmlspecialchars($data) 等同于 htmlspecialchars($data, ENT_COMPAT | ENT_HTML401)

htmlspecialchars($data, ENT_SUBSTITUTE) 丢弃来自 ENT_COMPATENT_HTML401 的规则到 just 使用来自 ENT_SUBSTITUTE.[=18 的规则=]

(而ENT_COMPAT导致双引号被转换)。

ENT_COMPAT | ENT_HTML401$flags 参数的 默认值 。当您传递 ENT_SUBSTITUTE 而不是 时,您将覆盖默认值。它现在不再应用 ENT_COMPAT,它负责引用。如果要ENT_SUBSTITUTE到默认参数,应该正确写成:

htmlspecialchars('"', ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE)