我正在尝试使用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来获得这种颜色,并且如果是这样,那是什么方式。
答案 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
由内而外地工作:
' color:'
之前添加了一个空格,以避免可能得到background-color
等。即使在color:
前面加上制表符,也可以在第一步中对空间进行规范化。;
规则的最后color
之前获取字符串。我很确定这里有很多潜在的故障点,并且我不建议您将XPath用于类似的事情,但这是一个有趣的练习。