Htmlentities只在被调用两次时才能在浏览器上工作


htmlentities works on browser only when called twice

现在这是一个完全奇怪的行为,我正在经历PHP: htmlentities似乎不工作时调用;因此,当我这样做时:

echo htmlentities("<iframe>");

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

然而,当我调用函数两次,它工作:

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

give me: <iframe>

我注意到这个回答的奇怪行为,用户表达了同样的困惑。

现在我有两个问题使用这个"答案是有效的":首先,我知道这是一个奇怪的行为,并不能保证这种奇怪的将复制(我希望它不是!)当我的代码导出到另一个服务器。其次,为什么会出现这种行为?

所以我的问题是:我很想知道这种行为的起源以及该怎么做。

很遗憾你们中的很多人无法验证我的问题,因为我正在本地主机上工作,htmlentities在其他服务器上工作得很好。

我想你对浏览器解释结果感到困惑

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

产生(原始输出)

&amp;lt;iframe&amp;gt;

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

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

所以它按预期工作。查看示例

因为当您对字符串<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的答案更容易理解。