htmlentities 仅在调用两次时才在浏览器上工作

htmlentities works on browser only when called twice

现在我在使用 PHP 时遇到了一个完全奇怪的行为:htmlentities 似乎在调用时不起作用;因此,当我这样做时:

echo htmlentities("<iframe>");

浏览器输出未转义的字符串参数,即<iframe>

但是,当我调用该函数两次时,它起作用了:

echo htmlentities(htmlentities("<iframe>"));

给我:<iframe>

我注意到奇怪的行为 from this answer 用户表达了同样的困惑。

现在我在使用这个 "answer which works" 时有两个问题:首先,我知道这是一种奇怪的行为,并且不能保证当我的代码导出到另一台服务器。其次,为什么会出现这种行为?

所以我的问题是:我很想知道这种行为的起源以及如何处理它。

鉴于我正在本地主机上工作并且 htmlentities 在其他服务器上工作正常,因此很多人无法验证我的问题,这很遗憾。

我认为您对浏览器解释结果感到困惑

echo htmlentities(htmlentities("<iframe>"));

生成(原始输出)

&amp;lt;iframe&amp;gt;

第一遍将 <> 转换为 &lt;iframe&gt;
第二步是将 & 转换为 &amp;

当您的浏览器呈现它时,&amp; 会呈现为 &,从而产生您问题中的输出。如果您查看源代码,您会看到我在上面发布的内容。

所以它按预期工作。 See a demo

因为当您对字符串 <iframe> 进行编码时,输出将作为 &lt;iframe&gt;.

发送到浏览器

现在,如果您要查看响应的 来源,您会按预期看到 &lt;iframe&gt;,但如果您正在查看 渲染页面您的浏览器将显示解码后的字符串<iframe>.

之所以"it works"双重编码是因为浏览器只剥离了一层编码显示。所以发送到浏览器的原始源是&amp;lt;iframe&amp;gt;,但显示的文本是&lt;iframe&gt;

htmlentities("<iframe>"); 创建 &lt;iframe&gt; ,就像你把它放在引号中一样输出到客户端,因为浏览器将 &lt; 解释为 <&gt; 作为 > 。有一次,你再次 运行 它,你真的在​​做这个 htmlentities('&lt;iframe&gt;'),计算结果为 &amp;lt;iframe&amp;gt;,在浏览器中显示为 &lt;iframe&gt;。希望这比 @Machavity 的回答更容易让您理解。