【问题标题】:Find setting in CSS with PHP xPath [duplicate]使用 PHP xPath 在 CSS 中查找设置 [重复]
【发布时间】:2019-03-20 07:43:33
【问题描述】:

我正在尝试使用 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-&gt;query( '//span' )-&gt;nodeValue) 的 CSS,然后使用 pregmatch 做一些事情以获得结果,但想知道是否有办法使用 xPath 获得这种颜色,如果有的话,那是什么方法。

【问题讨论】:

  • 让我们看一些代码来向我们展示您的尝试。 XPath 用于遍历 DOM,它不是 CSS 解析器。
  • @miken32,我得到了带有 $css = $path->query( '//span' )->nodeValue 的 CSS,就像问题中一样...
  • @miken32,它不是那个帖子的副本......那个帖子是问如何制作一个正则表达式,这个问题是关于使用 xpath 解决它 - 如果这可能的话
  • 这不可能,正如我所说的。
  • 您可以使用 selenium 并使用 xpath 来完成,但是就像@miken32 所说的那样,不能使用 DomDocument 解析器或任何其他使用 libxml 的 php 库。它们用于 xml 的原始解析

标签: php xpath domdocument


【解决方案1】:

XPath 不是特别适合这种任务,但与 cmets 中提出的相反,它可以使用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,但它仍然是一个有趣的练习。

【讨论】:

  • 跳出框框的奇妙思维方式。其他一些人似乎无法做到的事情(不,不可能,不赞成并离开那种)...感谢您的回答,尤其是“不推荐”部分。我解决了解析问题使用正则表达式的 CSS 就像我的第一个想法一样。如果 ID 中有另一个带有“跨度”的 CSS,我确实可以看到这个解决方案出错了......不过,感谢您指出它可以完成
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2014-07-30
  • 2013-06-19
  • 2021-05-22
  • 2018-06-03
相关资源
最近更新 更多