2016-08-27 2 views
-1

Этот html я получаю от ответа.Как заменить div одним из своих дочерних узлов p

И мне нужно удалить дополнительный текст.

Существует линия следующего содержания

<?php 
    $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; 

Как заменить DIV на р, который находится внутри него?

мне нужно написать регулярное выражение, чтобы получить следующий результат

<?php 
    $str = <<<HTML 
    AAAA <span>span txt</span> 
    <p class='unique_p'> 
     <span>p span text</span> 
     <p>p p text</p> 
    </p> 
    BBBB <span>span txt</span> 
HTML; 

Существует только один DIV и р с такими атрибутами.

+1

Мы не понимаем.Вы хотите изменить содержимое '$ str' после того, как вы создали первый пример во втором примере? – RiggsFolly

+0

Мне нужно получить результат, как во втором примере – Sergey

+0

Почему? Просто создайте отдельный вывод по любой причине, которую вы хотите изменить. – RiggsFolly

ответ

1

Поскольку вы смотрите на то, что кажется HTML, и учитывая, что ваши требования влекут за собой какую-либо модификацию в Document Object Model (DOM), я бы предложил использовать DOM-парсер, например DOMDocument.

Если я правильно понял ваш вопрос, вы хотите, чтобы заменить <div> узел, который, как представляется, имеют id атрибут xrz с p узла, который имеет атрибут класса для unique_p и является дитя div.

  1. Получение div легко, потому что он имеет id и они являются уникальными. Поэтому мы можем использовать метод DOMDocument::getElementById для получения этого div.
  2. Получение своего ребенка p получает немного сложнее, так как мы хотим убедиться, что это как ребенок div, так и указанный класс. Поэтому мы будем полагаться на запрос XPath, используя DOMXPath.
  3. Наконец, мы заменим 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 это будет просто неявно закрыть предыдущий первый.

+0

Wow.Perfect solution.Спасибо большое – Sergey

+0

Вы также должны указать атрибут класса 'div' при выполнении запроса. – revo

+0

@revo Это необязательно, так как 'id' должен быть уникальным на протяжении всей DOM в соответствии со спецификацией. «Id» достаточно, чтобы однозначно идентифицировать любой элемент в DOM без дополнительной квалификации. – Sherif

Смежные вопросы