@Shimpanze

PHP DomDocument: как перезаписать (аналог outerHTML) элемент в цикле?

Здравствуйте!

Подскажите, пожалуйста, как перезаписать текущий элемент в цикле, новым? Что-то типа метода outerHTML в JS.

<?php
$content = <<<EOD
<p>Lorem <a href="#">ipsum</a> dolor sit amet, consectetur adipisicing elit. Explicabo porro illum nesciunt. <a href="#">Voluptatem</a>, blanditiis esse, quod <a href="#">expedita</a> repellendus consequuntur dolore pariatur dicta tempora facere sint labore at magnam, rem assumenda.</p>

<p>Commodi, expedita? <a href="#">Accusantium reiciendis</a> in voluptatem veniam ullam! Et, porro architecto in dicta maxime blanditiis iusto, totam quis rerum voluptas numquam vero doloremque! Itaque impedit eligendi dignissimos, et <a href="#">veritatis eius</a>.</p>
EOD;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($content);
$xpath = new DOMXPath($dom);

$elements = $xpath->query('//a');

$content = '';

foreach($elements as $element) {
  if ($element->nodeName === 'a') {
    if ($element->hasAttribute('href')) {
      $href = $element->getAttribute('href'); // получаем ссылку
      $includes = $element->childNodes; // получаем содержимое ссылки (внутри могут быть HTML-теги)

      // И меняю текущий элемент на новый (как текст)
      $element = '&lt;a href="' . $href . '"&gt;' . $includes . '&lt;/a&gt;';

    }

    $content .= $dom->saveHTML($element);

    continue;
  }
  else { $content .= $dom->saveHTML($element); }
}


Как элемент в цикле заменить на новый?

Спасибо!
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
@bears
Вы бы уточнили, что хотите получить на выходе.

Для начала - в строке
$element = '&lt;a href="' . $href . '"&gt;' . $includes . '&lt;/a&gt;';
в переменной $includes у вас DOMNodeList, который "could not be converted to string"

Для замены ноды есть метод "replaceChild", раз уж работаете с dom объектом, то забудьте о том, что какие-то элементы можно создавать передав обычную строку, для этого есть метод "createTextNode". Работает это так:
$newElement = $dom->createTextNode('&lt;a href="' . $href . '"&gt;&lt;/a&gt;'); 
$element->parentNode->replaceChild($newElement, $element);


Если неправильно понял суть задачи, то пишите подробнее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы