【问题标题】:What is the best way to process external CSS stylesheets and inject into inline CSS elements?处理外部 CSS 样式表并注入内联 CSS 元素的最佳方法是什么?
【发布时间】:2009-08-01 10:55:37
【问题描述】:

我将编写一个 PHP 邮件列表系统。理想情况下,我希望模板样式易于管理。在我当前的系统中,我将所有样式都硬编码在模板中,如下所示:

<a href="http://blah/blah/blah" style="color: #a8a8a8;">click here</a>

在管理模板的人决定他们想要更改链接文本的颜色之前,这一切正常。我真正想要的是处理 HTML 和样式定义并使用适当的 HTML 输出 HTML。

我希望得到以下输入:

<style type="text/css">
a {
    color: #a8a8a8;
}
</style>
<a href="http://blah/blah/blah">click here</a>

...并生成...

<a href="http://blah/blah/blah" style="color: #a8a8a8;">click here</a>

...这样,如果样式表被更新,“渲染”的 HTML 将全部反映这些变化。

如果这可以与内联 &lt;style&gt;&lt;/style&gt; 标记或使用外部 CSS links 一起使用,那就太好了。

我这样做是因为我的经验表明,我使用的一些(大多数?全部?)网络邮件客户端似乎不尊重样式信息,无论是外部的还是其他的。如果我在这里遗漏了一些东西并且有一种更简单的方法可以做到这一点,我也很想听听这些建议。 :)

编辑 我做了更多查询,发现了另一个 Stackoverflow 问题 discusses CSS Selectors,我想我会尝试使用 phpQuery 之类的东西来处理这个问题。

【问题讨论】:

    标签: php css


    【解决方案1】:

    更新:在我意识到我误解了你的问题后,我重写了这篇文章。

    您可以编写一个 PHP 脚本,将所有样式块转换为每个 HTMLElement 的硬编码样式。伪代码可能是:

    1. load up an XML parser for the HTML email generated by your mailing list program
    2. xpath get all "style" nodes
    3. for each node, parse for the id and/or class of the CSS style (you'll need some regexes for these)
    4. for each id and/or class found, look up that node by attribute id or class (using xpath) and append to the existing value of the style attribute
    

    【讨论】:

    • 是的,类似的事情是我的后备计划。希望有一个库或其他我错过的东西,这样我就不必在 HTML 解析和 CSS 渲染领域做太多事情了。谢谢!
    • 不确定它是否适合您,但您可能需要研究 HAML/SASS。 haml.hamptoncatlin.comphphaml.sourceforge.net
    【解决方案2】:

    我为此使用emogrifier。它运行良好,它将所有 CSS 转换为 XPath 选择器,然后使用 PHP 的 DOMXPath (us.php.net/manual/en/class.domxpath.php) 查询节点并附加样式属性,然后输出带有 CSS 的 HTML内联。

    我遇到的唯一问题是 DOMXPath 似乎不喜欢它为在同一元素上选择多个类/ID 的选择器生成的 XPath 查询,即:

    #nav_home.current a .ir {
    ...
    }
    

    生成

    //*[@id="nav_home"]*[contains(concat(" ",@class," "),concat(" ","current"," "))]//a//*[contains(concat(" ",@class," "),concat(" ","ir"," "))] 
    

    这显然 DOMXPath 不喜欢。但除了那些选择器,它似乎工作得很好。

    所以我需要学习 XPath 并修复它的 XPath 生成器,或者找到另一个 XPath 生成器,或者我会尝试合并这个 PHPQuery 的东西。

    【讨论】:

    • 我将不得不对此进行调查!看起来很酷,很像我所希望的。
    【解决方案3】:

    我决定用phpQuery 来处理这个问题。我相信它为我的问题提供了最干净的解决方案。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多