2011-01-06 20 views
7

Aşağıdaki xtx89 Php'de bir düğüm/elemanın yerini almak için XPath ve DOM'ı nasıl kullanabilirim?

$html = ' 
<div class="website"> 
    <div> 
     <div id="old_div"> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <div class="a class"> 
       <p>some text</p> 
       <p>some text</p> 
      </div> 
     </div> 
     <div id="another_div"></div> 
    </div> 
</div> 
'; 

değerine sahip olduğumu ve #old_div ile aşağıdakileri değiştirmek istiyorum:

$replacement = '<div id="new_div">this is new</div>'; 

Sonuçların sonucunu vermek için:

$html = ' 
<div class="website"> 
     <div> 
      <div id="new_div">this is new</div> 
      <div id="another_div"></div> 
     </div> 
    </div> 
'; 

Kolayca bir kesim var mı Bunu PHP ile yapmak için -ve-yapıştır işlevi?


Tüm Gordon'un yardımları sayesinde son çalışma kodu:

<?php 

$html = <<< HTML 
<div class="website"> 
    <div> 
     <div id="old_div"> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <p>some text</p> 
      <div class="a class"> 
       <p>some text</p> 
       <p>some text</p> 
      </div> 
     </div> 
     <div id="another_div"></div> 
    </div> 
</div> 
HTML; 

$dom = new DOMDocument; 
$dom->loadXml($html); // use loadHTML if it's invalid XHTML 

//create replacement 
$replacement = $dom->createDocumentFragment(); 
$replacement ->appendXML('<div id="new_div">this is new</div>'); 

//make replacement 
$xp = new DOMXPath($dom); 
$oldNode = $xp->query('//div[@id="old_div"]')->item(0); 
$oldNode->parentNode->replaceChild($replacement , $oldNode); 
//save html output 
$new_html = $dom->saveXml($dom->documentElement); 

echo $new_html; 

?> 
+1

olası bir kopyası [Konumunu korurken düğümü değiştirmek için DOMXPath kullanarak ...] (http://stackoverflow.com/questions/640815/using-domxpath-to-replace-a-node-while- konumunun sürdürülmesi) – Gordon

+1

** Hedef düğümün ** bir DOM yöntemiyle ** değiştirilmesi için ** XPath kullanabilirsiniz **. Başlık reddediliyor. –

cevap

11

bağlantılı iki kopya halinde cevap, ben bir örnek vereyim o kapsamlı olmadığından:

$dom = new DOMDocument; 
$dom->loadXml($html); // use loadHTML if its invalid (X)HTML 

// create the new element 
$newNode = $dom->createElement('div', 'this is new'); 
$newNode->setAttribute('id', 'new_div'); 

// fetch and replace the old element 
$oldNode = $dom->getElementById('old_div'); 
$oldNode->parentNode->replaceChild($newNode, $oldNode); 

// print xml 
echo $dom->saveXml($dom->documentElement); 

Teknik olarak bunun için XPath gerekmez. Ancak, libxml sürümünüz olmayan geçerliliği belgeleri (id attributes are special in XML) için getElementById yapamam olabilir. Bu durumda, oluşturmak ve tek elemanlarını tek eklemek zorunda kalmadan alt düğümleri olan $newNode oluşturmak için

$xp = new DOMXPath($dom); 
$oldNode = $xp->query('//div[@id="old_div"]')->item(0); 

Demo on codepad


ile getElementById çağrısını yerine, yapabileceğiniz

$newNode = $dom->createDocumentFragment(); 
$newNode->appendXML(' 
<div id="new_div"> 
    <p>some other text</p> 
    <p>some other text</p> 
    <p>some other text</p> 
    <p>some other text</p> 
</div> 
'); 
+0

müthiş teşekkürler Gordon, şimdi bir deneyin! – Haroldo

+0

@gordon 'Açılabilir önemli hata: Argument 2, DOMNode :: replaceChild() yöntemine geçildiğinde, satır 24'te C: \ wamp \ www \ gv2010 \ user_area \ replacement-test.php dosyasında verilen boş bir DOMNode örneği olmalıdır? – Haroldo

+0

@Haroldo güncellendi. Üzgünüm, dikkat etmedi. – Gordon

-7

Belirli bir alanı gizlemek için önce jquery hide() öğesini kullanın ve ardından yeni div eklemek için imleci kullanın

$('#div-id').remove(); 
$('$div-id').append(' <div id="new_div">this is new</div>'); 
+2

Bir soru, PHP (sunucu tarafı), javascript (istemci tarafı) ile ilgili değildir. –

+3

artı istemci tarafı bu olsaydı bile çözümünüzü değiştirmekten ziyade çözümün yanlış olduğu için siteyi korumazdı ... – Haroldo

İlgili konular