【问题标题】:Render HTML blocks in page (PHP)在页面中呈现 HTML 块 (PHP)
【发布时间】:2018-07-29 21:16:04
【问题描述】:

我有一个从我们的 gmail 帐户收集的电子邮件数据库,我正在尝试将其呈现到内部页面。

这是可行的,但是偶尔会出现由于缺少/未关闭标签而导致问题的电子邮件。那里可能有一些我不想在整个页面上呈现的 CSS。

我可以使用 iFrame,但它们似乎已经过时,而且不是正确的方法。

建议的方法是从数据库中呈现 HTML 块,但不影响页面的其余部分?

【问题讨论】:

  • 当您说“渲染”时,您的意思是您正在使用浏览器引擎渲染 HTML 并输出图像吗?或者您是在谈论将电子邮件中的任意 HTML 注入页面而不会对该页面产生副作用?
  • “我可以使用 iFrame,但它们似乎已经过时,而且不是正确的方法。”是什么让你这么说?
  • 对不起 - 错误地使用了渲染这个词。将电子邮件中的任意 HTML 注入页面而不会对该页面产生副作用。很高兴被我的方法击落,以前没有做过!但很好奇“Google”之类的东西如何在不影响整个页面的情况下呈现它。
  • Google 可能会更改许多标签 ID 等,并不是您可以使用任何您喜欢的 html 代码,也不是所有的 CSS 都可以在那里使用。

标签: php html


【解决方案1】:

首先,您需要加载该 HTML 并将其解释为未损坏的内容。为此,您使用 DOM 解析器。 http://php.net/manual/en/domdocument.loadhtml.php

我可以使用 iFrame,但它们似乎已经过时,而且不是正确的方法。

不,这是错误的。在我们获得良好的shadow DOM 支持之前(甚至可能在之后),iframe 是在其自身上下文中隔离某些内容的正确方法。确保你use the sandboxproperty

请注意,您可以在没有 iframe 的情况下执行此操作,但需要做更多的工作。

但很好奇“Google”之类的东西如何在不影响整个页面的情况下呈现它。

Google 不仅接受通过该电子邮件发送的任何内容,您也不应该接受,即使您使用 iframe 方法也是如此。您需要列出您将支持的元素的白名单,并过滤掉除此之外的所有内容。接下来,您需要弄清楚您将支持哪些 CSS 属性。最后,您需要将整个 DOM 文档转换为有用的东西并将其输出为 HTML。查看HTML Purifier 以获取您的白名单。

这一切都不是一件容易的事。你陷入了很多麻烦。 HTML 电子邮件没有真正的标准。每个提供商和邮件客户端都有不同的支持集合,并且结果也各不相同。

【讨论】:

    【解决方案2】:

    对于 CSS 部分,您可以添加例如 id 为您有电子邮件内容的 div,然后将 id 添加为所有 css 选择器的父亲!喜欢this

    并且您可以检查标签是否正确关闭,这两种想法可能需要一些处理能力但不多,并且您可以通过预处理和存储结果来防止重新计算。

    【讨论】:

      【解决方案3】:

      我不会说 iFrames 已经过时了,我会认为它们在您的情况下是有效的输出。

      但很好奇“Google”之类的东西如何在不影响整个页面的情况下呈现它。

      如果您检查,他们会使用 iFrame。

      100% 同意 @brad 通过解析器运行它,然后将其输出到 iFrame。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 2023-03-20
        相关资源
        最近更新 更多