DOM işleme

2 Cevap php

Im oldukça belirli bir işi yapmak için PHP DOM kullanmak için çalışıyor ve Ive şimdiye kadar hiçbir şans var, nesnel bir Wordpress blog yazısı (DB, bu bir wordpress eklentisi) gelen bir HTML dizesi almaktır. Ve o HTML üzerinden onun yerine <div id="do_not_edit">new content</div>" ile <div id="do_not_edit">old content</div>" olarak değiştirin. Kendi yapısı içinde bu div üstünde ve altında bir şey tasarruf.

Sonra, geri DB içine tasarruf HTML gerçekten basit olmalı, ben Ive yerine DOM döndü böylece regex buraya gitmek için doğru bir yol olmaz ki okudum.

Sorun sadece cant, onu işe almak div veya herhangi bir şey elde cant.

Bana yardım!

UPDATE

: Wordpress tablo çıkan HTML gibi görünüyor

Congratulations on finding us here on the world wide web, we are on a  mission to create a website that will show off your culinary skills  better than any other website does.

<div id="do_not_edit">blah blah</div>
We want this website to be fun and  easy to use, we strive for simple elegance and incredible functionality.We aim to provide a 'complete package'. By this we want to create a  website where people can meet, share ideas and help each other out.

Birkaç farklı (yanlış) işleyişini sonra Ive aşağıda var hepsi:

$content = ($wpdb->get_var( "SELECT `post_content` FROM $wpdb->posts WHERE ID = {$article[post_id]}" ));        

$doc = new DOMDocument();
$doc->validateOnParse = true; 
$doc->loadHTMLFile($content);
$element = $doc->getElementById('do_not_edit');
echo $element;

2 Cevap

Eğer WordPress HTML sadece bir div içerdiğinden emin değilseniz, aşağıdaki çalışması gerekir:

$doc = new DOMDocument();
$doc->validateOnParse = false; 
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');
echo $divs->item(0)->textContent;

Değilse, deneyin:

$doc = new DOMDocument();
$doc->validateOnParse = false; 
$doc->loadHTML($content);
$divs = $doc->getElementsByTagName('div');

for($i=0; $i<$divs->length; $i++)
{
  $id = $divs->item($i)->attributes->getNamedItem('id');
  if($id && $id->value == 'do_not_edit')
  {
    //your code here...
    $node = $divs->item($i);
    $newText = new DOMText("This is some new content");

    $node->appendChild($newText);
    $node->removeChild($node->firstChild);
    break;
  }
}

$html = $doc->saveHTML();

Sizin HTML DOMDocument ne beklediğini tam bir HTML belgesi değildir. Bir seçenek tam bir belge bulunuyor böylece HTML sarmak olacaktır:

$content = ($wpdb->get_var( "SELECT `post_content` FROM $wpdb->posts WHERE ID = {$article[post_id]}" ));

$content = '<html><head><title></title></head><body>'.$content.'</body></html>';

$doc = new DOMDocument();
$doc->validateOnParse = false; 
$doc->loadHTML($content);
$element = $doc->getElementById('do_not_edit');
echo $element;

Biraz hacky, ama kolayca sorunu çözebilir.