2016-08-27 9 views
-1

このhtml私はResponseから取得します。divをその子のpノードの1つに置き換える方法

余分なテキストを削除する必要があります。

次の内容

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

の線が内側にあるP上の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、pがありますを取得する正規表現を記述する必要があります。

+1

わかりません。2番目の例に最初の例を作成した後、内容を '$ str'に変更したいのですか? – RiggsFolly

+0

2番目の例のように結果を得る必要があります – Sergey

+0

なぜですか? – RiggsFolly

答えて

1

HTMLと思われるものを見ていて、あなたの要件がDocument Object Model (DOM)に何らかの変更を加える必要があることを考えれば、DOMDocumentのようなDOMパーサーを使用することをお勧めします。

私が正しくあなたの質問を理解している場合は、unique_pのclass属性を持ち、divの子あるpノードとxrzid属性を持っているように見えます<div>ノードを置き換えるために探しています。それはidを持っており、彼らは一意であるため、取得div

  1. は、簡単です。したがって、DOMDocument::getElementByIdのような方法を使用して、divを得ることができます。
  2. 子を取得するpは、それがdivの子であり、指定されたクラスを持っていることを確認したいので、ややこしいです。したがって、DOMXPathを使用してクエリをXPathに依存します。
  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パーサはそれだけで暗黙のうちに最初の前の1を閉鎖する別のpタグの内側に開口部pタグを検索します。

+0

Wow.Perfect solution.Thank you very muchありがとうございます。 – Sergey

+0

クエリーの実行中に 'div'クラス属性も指定する必要があります。 – revo

+0

@revoそれは、仕様に従って、 'id'がDOM全体で一意でなければならないので不要です。 'id'は、それ以上の資格なしにDOM内の要素を一意に識別するのに十分です。 – Sherif

関連する問題