使用PHP xPath在CSS中查找设置

时间:2018-10-15 20:20:08

标签: php xpath domdocument

我正在尝试使用DOMDocument / xPath在以下HTML示例的CSS中的链接集中找到一个跨度的颜色:

   <html>
      <head>
          <style>
             a span{
                color: #21d;
             }
          </style>
      </head>
      <body>
          <a href='test.html'>this is a <span>test</span></a>
      </body>
   </html>

我可以找到所有带有xPath'// style'($css = $path->query( '//span' )->nodeValue)的CSS,然后用pregmatch做一些事情以获得结果,但是想知道是否有办法使用xPath来获得这种颜色,并且如果是这样,那是什么方式。

1 个答案:

答案 0 :(得分:1)

XPath不是特别适合这种任务,但是与注释中提出的相反,它可以使用 evaluate()和一些嵌套的字符串函数,例如substring-before()substring-after()

$html = '
    <html>
      <head>
          <style>
             a span{
                background-color: #ddd;
                color: #21d;
             }
          </style>
      </head>
      <body>
          <a href="test.html">this is a <span>test</span></a>
      </body>
   </html>
';

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DomXPath($dom);

$result = $xpath->evaluate("
    substring-before(
        substring-after(
            substring-after(
                normalize-space(//style/text())
            , 'a span')
        ,' color:')
    ,';')
");
echo $result;

输出:

  

#21d

由内而外地工作:

  1. 规范空白。
  2. 在选择器之后获取样式文本的一部分。
  3. 在有问题的CSS规则之后获取文本。注意,我在' color:'之前添加了一个空格,以避免可能得到background-color等。即使在color:前面加上制表符,也可以在第一步中对空间进行规范化。
  4. ;规则的最后color之前获取字符串。

我很确定这里有很多潜在的故障点,并且我不建议您将XPath用于类似的事情,但这是一个有趣的练习。