使用 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
由内而外的工作:
- 标准化白色space。
- 获取选择器后面的样式文本部分。
- 获取相关 css 规则之后的文本。请注意,我在
' color:'
之前添加了一个 space 以避免可能得到 background-color
等。即使 color:
前面有一个制表符,在第一步中标准化 space 也能使这项工作正常进行。
- 获取
color
规则最后 ;
之前的字符串。
我很确定这里有很多潜在的失败点,我不建议将 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
由内而外的工作:
- 标准化白色space。
- 获取选择器后面的样式文本部分。
- 获取相关 css 规则之后的文本。请注意,我在
' color:'
之前添加了一个 space 以避免可能得到background-color
等。即使color:
前面有一个制表符,在第一步中标准化 space 也能使这项工作正常进行。 - 获取
color
规则最后;
之前的字符串。
我很确定这里有很多潜在的失败点,我不建议将 XPath 用于这样的事情,但这仍然是一个有趣的练习。