Манипулирование DOM - PullRequest
1 голос
/ 26 мая 2010

Я пытаюсь использовать DOM в PHP для выполнения довольно специфической работы, и мне пока не повезло, цель состоит в том, чтобы взять строку HTML из поста в блоге Wordpress (из БД, это плагин для wordpress) , И затем вместо этого HTML замените <div id="do_not_edit">old content</div>" на <div id="do_not_edit">new content</div>". Сохранение чего-либо выше и ниже этого div в его структуре.

Затем сохраните HTML обратно в БД, на самом деле все должно быть просто, я прочитал, что регулярное выражение не будет правильным способом, поэтому я обратился к DOM.

Проблема в том, что я просто не могу заставить его работать, не могу извлечь div или что-то еще.

Помоги мне !!

UPDATE

HTML-код из таблицы wordpress выглядит следующим образом:

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.

После нескольких различных (неправильных) обработок все, что я получил ниже:

$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 ]

3 голосов
/ 26 мая 2010

Если вы уверены, что HTML из WordPress содержит только один div, должно работать следующее:

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

Если нет, попробуйте:

$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();
1 голос
/ 26 мая 2010

Ваш HTML не является полным документом HTML, чего ожидает DOMDocument. Один из вариантов - обернуть ваш HTML, чтобы он был полным документом:

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

Это немного глупо, но может легко решить проблему.

...