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
Работа изнутри:
- Нормализация пробелов.
- Получение части текста стиля после выбора.
- Получитьтекст после рассматриваемого правила css.Обратите внимание, что я добавил пробел перед
' color:'
, чтобы избежать получения background-color
или подобного.Нормализация пробела в первом шаге делает эту работу, даже если color:
предшествует табуляция. - получает строку перед последним
;
правила color
.
Я почти уверен, что здесь есть множество потенциальных точек отказа, и я бы не рекомендовал использовать XPath для чего-то подобного, но все равно это интересное упражнение.