从PHP获取CSS样式

从PHP获取CSS样式,php,dom,Php,Dom,我正在使用简单的DOM解析器解析页面。它很整洁,但是我想为每个元素获得应用的css样式。不仅是内联样式,而且它应用于该元素的所有样式,无论是内联的、页面内的还是外部的 有这样的课程吗?如果没有,你会怎么做?我并不真正关心覆盖样式、层叠样式或特定于浏览器的样式。拥有所有直接应用的样式就足够了。这是一个相当高的要求。考虑这个简单的例子: <style> p .foo { color: yellow; } span > *[href] { col

我正在使用简单的DOM解析器解析页面。它很整洁,但是我想为每个元素获得应用的css样式。不仅是内联样式,而且它应用于该元素的所有样式,无论是内联的、页面内的还是外部的


有这样的课程吗?如果没有,你会怎么做?我并不真正关心覆盖样式、层叠样式或特定于浏览器的样式。拥有所有直接应用的样式就足够了。

这是一个相当高的要求。考虑这个简单的例子:

<style>
   p .foo {
     color: yellow;
   }
   span > *[href] {
     color: red;
   }
   img + .foo {
     color: green;
   }
   span #bar {
     color: blue;
   }
   .baz #bar {
     color: black;
   }
</style>      
<p class="baz">Lorem ipsum <span>dolor sit 
  <img src="x.png"><a id="bar" class="foo" href="#top">amet</a>,</span>
  consectetur adipiscing elit.
</p>

p.foo{
颜色:黄色;
}
span>*[href]{
颜色:红色;
}
img+.foo{
颜色:绿色;
}
跨距#杆{
颜色:蓝色;
}
.baz#bar{
颜色:黑色;
}
Lorem ipsum dolor-sit
,
献祭精英。

链接是什么颜色的?这5种样式中的每一种都直接应用于链接元素。即使你只考虑CSS2.1,你仍然有3种风格来处理。 正如Gumbo所说,如果没有完整的CSS解析器和解释器,这是无法解决的。我还没有见过用PHP编写的,虽然理论上可以编写一个

(有用于CSS解析的类,是的-请参阅的答案,但这些类只会告诉您“对于这个文件,您有这些CSS声明”。解释器是最难的部分,我不知道有PHP解释器)


您最好的选择是在某些网页呈现引擎(如Gecko或Webkit)中呈现页面,并查询CSS属性。不幸的是,这远远超出了一个简单PHP类的范围。

正如Martin所说,这样做几乎是在用PHP编写浏览器——这是一个大问题!与任何大型项目一样,关键是将其分解为更易于管理的步骤(尽管其中有些步骤并不简单)

您需要:

  • 确定链接到哪些外部css文件(如果有)
  • (回应Gumbo):找到(或开发)一种阅读和解释外部css的方法,包括页面css和内联css
  • 确定应用于每个元素的样式(包括.class、#id和元素类型应用的样式)以及每个元素的父元素-包括哪些css规则覆盖哪些其他css规则,等等

我不会说这是不可能的,因为像这样的事情几乎可以做同样的事情(并且可能提供一个很好的起点),但我不认为有一个简单的快速修复方法。

你可能想查看的CSS部分-我们也需要这个功能,并且基本上已经构建了一个基于DOMDocument的psuedo浏览器。由于DOMDocument中XPath的一些奇怪之处,我们不得不在页面上的每个节点上添加一个属性,作为指向计算样式中心数组的指针,但就通过W3C测试而言,我们已经完成了大约70%的工作。

您还需要一个CSS解析器和解释器来完成这项工作。我认为这在PHP中是不可能的。主要问题是您将尝试模拟浏览器的行为。主要问题在于CSS和XHTML的级联。您可以为一个元素获得样式,这将很难,但可以做到。但问题是获取父元素的所有样式,并在转到子元素时将其覆盖。第二个想法是,样式的应用顺序与浏览器的应用顺序相同。