htmlentities仅在被调用两次时才在浏览器上运行

时间:2016-08-18 00:40:18

标签: php database html-entities

现在我在PHP中遇到了一个非常奇怪的行为:htmlentities在调用时似乎无法正常工作;因此,当我这样做时:

echo htmlentities("<iframe>");

浏览器输出字符串参数unescaped,即<iframe>

但是,当我调用该函数两次时,它可以工作:

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

给我:<iframe>

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

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

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

很遗憾,如果我在本地主机上工作并且htmlentities在其他服务器上正常工作,那么很多人都无法验证我的问题。

3 个答案:

答案 0 :(得分:6)

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

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

生成(原始输出)

&amp;lt;iframe&amp;gt;

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

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

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

答案 1 :(得分:2)

因为当您对字符串tablex.titleLabel.text = buttonText 进行编码时,输出将以<iframe>的形式发送到浏览器。

现在,如果您要查看回复的来源,您可以按预期看到&lt;iframe&gt;,但是如果您正在查看呈现的内容页面您的浏览器将显示已解码的字符串&lt;iframe&gt;

&#34;它起作用的原因&#34;当你进行双重编码时,这是因为你的浏览器只剥离了一层编码用于显示。因此,发送到浏览器的原始来源为<iframe>,但显示的文字为&amp;lt;iframe&amp;gt;

答案 2 :(得分:1)

graphite: - period: 60 timeunit: 'SECONDS' prefix: 'dev.servers' hosts: - host: 'cassandra-1' port: 2003 predicate: color: "black" useQualifiedName: true patterns: - "^org.apache.cassandra.metrics.Table.+" - "^org.apache.cassandra.metrics.keyspace.+" 创建htmlentities("<iframe>");,就像您将其放在引号中一样输出到客户端,因为浏览器会将&lt;iframe&gt;解释为&lt;<&gt;。有一次,你再次运行它,你真的这样做>,其评估为htmlentities('&lt;iframe&gt;'),在浏览器中显示为&amp;lt;iframe&amp;gt;。希望这比&lt;iframe&gt;的回答更容易理解。