Поскольку вы смотрите на то, что кажется HTML, и учитывая, что ваши требования влекут за собой какую-либо модификацию в Document Object Model (DOM), я бы предложил использовать DOM-парсер, например DOMDocument
.
Если я правильно понял ваш вопрос, вы хотите, чтобы заменить <div>
узел, который, как представляется, имеют id
атрибут xrz
с p
узла, который имеет атрибут класса для unique_p
и является дитя div
.
- Получение
div
легко, потому что он имеет id
и они являются уникальными. Поэтому мы можем использовать метод DOMDocument::getElementById
для получения этого div
.
- Получение своего ребенка
p
получает немного сложнее, так как мы хотим убедиться, что это как ребенок div
, так и указанный класс. Поэтому мы будем полагаться на запрос XPath, используя DOMXPath
.
- Наконец, мы заменим
div
на захваченного ребенка p
, используя DOMNode::replaceChild
оттуда.
Вот простой пример.
$str = <<<HTML
AAAA <span>span txt</span>
<div class='unique_div' id='xrz' data-id='1'>
div text
<span>span text</span>
<p class='unique_p'>
<span>p span text</span>
<p>p p text</p>
</p>
div text
</div>
BBBB <span>span txt</span>
HTML;
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
$children = $xpath->query('//div/p[@class="unique_p"]');
$p = $children->item(0);
$div = $dom->getElementById('xrz');
$div->parentNode->replaceChild($p, $div);
echo $dom->saveHTML();
Результат должен выглядеть примерно так.
<p>AAAA <span>span txt</span>
<p class="unique_p">
<span>p span text</span>
</p><p>
BBBB <span>span txt</span></p></p>
В случае, если вам интересно, почему выход может немного отличаться от того, что вы могли бы ожидать, это важно отметить, что ваш первоначальный HTML, если в вашем вопросе, на самом деле поврежден.
See section 9.3.1 of the HTML 4.01 specification
P
элемент представляет собой пункт. Он не может содержать элементы уровня блока (, включая P
сам).
Таким образом, каждый раз, когда DOM парсер находит отверстие p
тег внутри другого тега p
это будет просто неявно закрыть предыдущий первый.
Мы не понимаем.Вы хотите изменить содержимое '$ str' после того, как вы создали первый пример во втором примере? – RiggsFolly
Мне нужно получить результат, как во втором примере – Sergey
Почему? Просто создайте отдельный вывод по любой причине, которую вы хотите изменить. – RiggsFolly