DOMDocument получает nodeValue каждого соответствующего элемента

Я взломал это некоторое время и просто не могу понять это правильно.

Как вы можете получить содержимое всех элементов скрипта, если количество элементов скрипта является переменным. Мой пример разметки выглядит так:

<div></div>
<iframe><iframe>
<script>xxxx</script>
<script>xxxx</script>
<script>xxxx</script>

То, что у меня есть до сих пор, работает только в том случае, если я сохраняю количество скриптов статичным, поэтому ясно, что я неправильно перебираю массив, но меня полностью бросает Документация по DOMXPath, как это сделать. Это то, что у меня есть до сих пор:

$dom = new DOMDocument();
$dom->preserveWhiteSpace = true;
@$dom->loadHtml($form_content);
$xpath = new DOMXPath($dom);
$items = $xpath->query('//script');
foreach ($items as $item) {
     $scriptContents = $item->previousSibling->previousSibling->nodeValue . "\r\    n\r\n";
     $scriptContents .= $item->previousSibling->nodeValue . "\r\n\r\n";
     $scriptContents .= $item->nodeValue . "\r\n\r\n";
}
echo $scriptContents;

Как мне это сделать? Я некоторое время искал SO, но, похоже, могу применить решение, которое работает. Заранее спасибо - б


person orionrush    schedule 23.07.2013    source источник
comment
Я не понимаю проблемы. Если у вас есть 3 тега script, ваш foreach будет повторяться 3 раза, если у вас есть 10 тегов script, он будет повторяться 10 раз. Какое поведение, которое отличается от этого, вы видите? можете ли вы показать HTML, из-за которого это не соответствует действительности? Теперь мне не совсем понятно, что вы пытаетесь сделать с $scriptContents, поскольку вы перезаписываете переменную с каждой итерацией. Возможно, это объясняет разницу между тем, что вы ожидаете, и тем, что происходит на самом деле. Мне кажется, что это будет отображать только три последних родственных узла последнего тега сценария.   -  person Mike Brant    schedule 24.07.2013
comment
Проверьте этот ответ и ссылку на используемую библиотеку, это очень просто и будет позвольте вам загрузить HTML из string тоже.   -  person The Alpha    schedule 24.07.2013
comment
@MikeBrant - Новый день, и я вижу это, основная ошибка, которую я упустил из виду, поскольку думал, что делаю что-то не так с DOMXPath. Как вы указали, $scriptContents была проблема, мне нужно сначала объявить ее, а затем $scriptContents .= $item->previousSibling->nodeValue; получит содержимое всех узлов скрипта, как и ожидалось. Если вы хотите написать это как ответ, я приму это.   -  person orionrush    schedule 24.07.2013


Ответы (1)


Похоже, что вы перезаписываете $scriptContents с каждой итерацией, что, вероятно, не то, что вы намеревались. При том, как скрипт работает в настоящее время, ваш вывод будет ограничен двумя предыдущими братьями и сестрами последнего тега скрипта (независимо от того, являются ли они на самом деле сами тегами скрипта) вместе с последним тегом скрипта.

Если вы строго пытаетесь вывести теги script, вы можете сделать это:

$xpath = new DOMXPath($dom);
$items = $xpath->query('//script');
foreach ($items as $item) {
     echo $item->nodeValue . "\r\n\r\n";
}
person Mike Brant    schedule 24.07.2013