处理外部CSS样式表并注入内联CSS元素的最佳方法是什么?

时间:2009-04-06 04:59:39

标签: php css

我将编写一个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将全部反映这些变化。

如果可以将其用于内联<style></style>标记或使用外部CSS links,那就太棒了。

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

修改 我做了一些更多的查询,发现了discusses CSS Selectors的另一个Stackoverflow问题,我想我会尝试用像phpQuery这样的东西来处理这个问题。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我正在使用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。

答案 2 :(得分:0)

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