2011-01-26 2 views
9

Я пытаюсь разобрать документ и получить все теги изображений и изменить источник чего-то другого.php DomDocument добавляет дополнительные теги

 

    $domDocument = new DOMDocument(); 

    $domDocument->loadHTML($text); 

    $imageNodeList = $domDocument->getElementsByTagName('img'); 

    foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
    } 

    $text = $domDocument->saveHTML(); 
 

в $ текст изначально выглядит следующим образом:


<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>

и это выход $ текст:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>

Я получаю кучу дополнительных тегов (HTML, тела , и комментарий наверху), что мне действительно не нужно. Любой способ настроить DOMDocument, чтобы не добавлять эти дополнительные теги?

Спасибо!

ответ

5

DomDocument, к сожалению, запатентован и не позволит вам сделать это. Попробуйте это:

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML())); 
+1

следует читать: $ Text = preg_replace ('/^ /', '', str_replace (массив ('', '', '', ' '), массив ('', '', ' ',' '), $ domDocument-> saveHTML())); –

+0

'preg_replace', правда? – sglessard

-1

Если вы собираетесь сохранять как HTML, вы должны ожидать, что будет создан действительный документ HTML!

Существует еще один вариант: DOMDocument::saveXML имеет дополнительный параметр, позволяющий вам получить доступ к содержимому XML конкретного элемента:

$el = $domDocument->getElementsByTagName('p')->item(0); 
$text = $domDocument->saveXML($el); 

Это предполагает, что содержание имеет только один p элемента.

+0

в зависимости от используемых элементов внутри документа, это не всегда хорошая идея использовать saveXML() для извлечения HTML-источник , Созданный XML будет использовать сокращенное обозначение для всех элементов без содержимого, что может повредить HTML-документ (например, '

10

Вам нужно добавить 2 флага к методу loadHTML(): LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD. То есть

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 

См IDEONE demo:

$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>'; 
$domDocument = new DOMDocument; 
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 
$imageNodeList = $domDocument->getElementsByTagName('img'); 

foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
} 

$text = $domDocument->saveHTML(); 
echo $text; 

Выход:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p> 
+2

Это сработало, должен быть лучшим ответом. Благодарю. – Lynnais

+0

Для меня это просто удаляет все html. Мои абзацы тоже ушли. – Mike

+0

@Mike: Это невозможно, поскольку код ничего не удаляет. Возможно, HTML, который у вас есть, не совсем корректен. Попробуйте добавить 'libxml_use_internal_errors (true);' перед инициализацией DOMDocument с '$ domDocument = new DOMDocument;'. –

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