DOMDocument вполне юзабильная вещь, но, как всегда, нужно учитывать кое-какие особенности связанные с кодировкой, например если просто загрузить кусок HTML а потом его сохранить, то получится вот такая штука:
чтобы задать кодировку для куска HTML, надо сделать так:
$html = 'some html'; $doc = new DOMDocument(); $doc->loadHtml('<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $html . '</body></html>'); //do somethig with $doc at this point $xpath = new DOMXPath($doc); $body = $xpath->query('/html/body'); $saved_html = $doc->saveXml($body->item(0));
в данном случае, от тэгов <html> и <head> мы избавляемся, но остается тэг <body>. Чтобы избавиться от <body> надо сделать немного хитрее:
$html = ""; foreach ($body->item(0)->childNodes as $node) { $html = $html . $doc->saveXML($node); } $saved_html = $html;
Кроме кодировки PHP DOMDocument имеет ещё одну особенность – после сохранения документа в нем появляются символы “ ”:
это происходит потому, что PHP DOMDocument не любит HTML в Windows-кодировке, поэтому перед загрузкой надо конвертировать HTML в UNIX-кодировку:
$unix_html = preg_replace("/\r\n/", "\n", $html, -1, $rep_count); $doc = DOMUtil::LoadHtml($unix_html);
а ещё лучше сделать так:
$unix_html = str_replace("\r", "", $html);