使用 PHP xPath 在 CSS 中查找设置

Find setting in CSS with PHP xPath

我正在尝试使用 DOMDocument/xPath:[=14 在以下 HTML 示例的 CSS 中找到 link 中的跨度颜色=]

   <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 然后用预匹配做一些事情来得到结果,但想知道是否有办法得到这种颜色使用 xPath,如果是这样,那是什么方式。

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. 标准化白色space。
  2. 获取选择器后面的样式文本部分。
  3. 获取相关 css 规则之后的文本。请注意,我在 ' color:' 之前添加了一个 space 以避免可能得到 background-color 等。即使 color: 前面有一个制表符,在第一步中标准化 space 也能使这项工作正常进行。
  4. 获取 color 规则最后 ; 之前的字符串。

我很确定这里有很多潜在的失败点,我不建议将 XPath 用于这样的事情,但这仍然是一个有趣的练习。