@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);


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 21:00
5000 руб./за проект
03 мая 2024, в 20:41
15000 руб./за проект
03 мая 2024, в 20:03
5000 руб./за проект