я не могу узнать, как решить этуTraverse DOM находкой идентификатор назад
<div>
<p id="p1"> Price is <span>$ 25</span></p>
<p id='p2'> But this price is $ <span id="s1">50,23</span> </p>
<p id='p3'> This one : $ 14540.12 dollar</p>
</div>
Что я пытаюсь сделать, это найти элемент с ценой в нем, и это самый короткий путь к нему. Это то, что у меня есть.
$elements = $dom->getElementsByTagName('*');
foreach($elements as $child)
{
if (preg_match("/.$regex./",$child->nodeValue)){
echo $child->getNodePath(). "<br />";
}
}
Это приводит к
/html
/html/body
/html/body/div
/html/body/div/p[1]
/html/body/div/p[1]/span
/html/body/div/p[2]
/html/body/div/p[2]/span
/html/body/div/p[3]
Таковы пути к элементам я хочу, так что все нормально в этом тесте HTML. Но на реальных веб-страницах этот путь очень длинный и подвержен ошибкам. Что я хотел бы сделать, это найти ближайший элемент с атрибутом идентификатора и обратиться к нему.
Так что, когда мы нашли элемент и сопоставили $ regex, мне нужно пройти DOM и найти первый элемент с атрибутом ID и создать новый более короткий путь. В приведенном выше примере HTML есть 3 цены, соответствующие $ regex. Цены указаны в:
//p[@id="p1"]/span
//p[@id="s1"]
//p[@id="p3"]
Так вот что я хотел бы вернуть из своей функции. Я также должен избавиться от всех других существующих путей, потому что они не содержат $ regex
Любая помощь по этому вопросу?
Должен ли я использовать SimpleXML вместо этого? – harmstra
Итак, это будет какой-то анализ предварительной обработки для подготовки фактического XSLT, который будет применяться? Интересно! –