Я думаю, что так должно быть:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$elements = $xpath->query('//pre | //code');
В некоторых случаях (например, если вы используете getElementsByTagName вместо XPath), вам нужно работать с массивом, чтобы получить правильное поведение (см. этот вопрос ), поэтому вам необходимо скопировать узлы в массив. Я сделаю это для этого примера:
$array = array();
foreach ($elements as $element) {
$array[] = $element;
}
foreach ($array as $element) {
$tag = $element->tagName;
$content = $element->textContent;
$lang = $element->getAttribute('lang');
$new_content = my_function($tag, $content, $lang);
$new_element = $dom->createElement('div');
$new_element->setAttribute('class', "$tag $lang");
$new_element->nodeValue = $new_content;
$element->parentNode->replaceChild($new_element, $element);
}
Конечно, в приведенном выше примере my_function
не определено. Но это должно дать вам хорошее представление о том, как это сделать.
Обратите внимание, что это не будет работать на вложенных элементах, например:
<code><pre lang="html">
<p>some nested element</p>
<p> a paragraph </p>
Если вы хотите работать с вложенными элементами, используйте функцию для получения innerHTML вместо использования $element->textContent
.