【问题标题】:htmlentities works on browser only when called twice [closed]htmlentities 仅在调用两次时才在浏览器上工作[关闭]
【发布时间】:2016-08-18 00:40:18
【问题描述】:

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

echo htmlentities("<iframe>");

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

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

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

给我:<iframe>

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

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

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

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

【问题讨论】:

  • 这不仅适用于 PHP 7,我在 5.6.23 上也得到了与您相同的结果,所以这必须追溯到更远的地方。
  • 查看源代码,你会看到你得到了正确的结果。
  • "浏览器输出未转义的字符串参数,即
  • “让我们忘记浏览器吧,我使用的是数据库,它保存原始 HTML,没有编码” - 那么你没有在这里向我们展示整个图片以及如何您正在插入它以及使用了哪些函数/API 等。现在那个“数据库”评论是一个全新的球赛;如果我可以说,你给我们扔了一个弧线球。所以现在,情节似乎变厚了。
  • 我同意@Fred-ii-您如何渲染数据库中的内容?命令行界面?工作台? PHPMyAdmin?如果是最后一个,您仍在通过浏览器查看数据库输出

标签: php database html-entities


【解决方案1】:

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

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

产生(原始输出)

&amp;lt;iframe&amp;gt;

传递一个将&lt;&gt;转换为&amp;lt;iframe&amp;gt;
第二遍是将&amp;amp; 转换为&amp;amp;

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

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

【讨论】:

  • 感谢您的回答,@Machavity,但您错过了我的意思。当调用两次时,浏览器会输出结果,就好像它被调用一次一样。调用两次时,请参阅我的输出示例,它与您给出的输出不同。
  • @che-azeh 我想你没听懂我说的。我试图进一步澄清这一点,但您对浏览器将&amp;amp; 渲染为&amp;amp; 感到困惑
  • 哦,我明白了 :-)。谢谢!
【解决方案2】:

因为当您对字符串&amp;amp;lt;iframe&amp;amp;gt; 进行编码时,输出将作为&amp;amp;lt;iframe&amp;amp;gt; 发送到浏览器。

现在,如果您查看响应的来源,您会看到&amp;amp;lt;iframe&amp;amp;gt;,但如果您查看的是渲染页面,您的浏览器会显示解码后的字符串&amp;amp;lt;iframe&amp;amp;gt;

双重编码时“它起作用”的原因是因为您的浏览器仅剥离了一层编码以进行显示。所以发送到浏览器的原始源是&amp;amp;lt;iframe&amp;amp;gt;,但显示的文本是&amp;amp;lt;iframe&amp;amp;gt;

【讨论】:

    【解决方案3】:

    htmlentities("&lt;iframe&gt;"); 创建 &amp;amp;lt;iframe&amp;amp;gt; ,它将像您在引号中一样输出到客户端,因为浏览器将 &amp;lt; 解释为 &lt;&amp;gt; 解释为 &gt; 。有一次,在此基础上再次运行它,您实际上是在执行此操作 htmlentities('&amp;lt;iframe&amp;gt;'),其计算结果为 &amp;amp;lt;iframe&amp;amp;gt;,在浏览器中显示为 &amp;amp;lt;iframe&amp;amp;gt;。希望这比@Machavity 的回答更容易让您理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多