DOMDocument::loadHTML

(PHP 5, PHP 7)

DOMDocument::loadHTML Загрузка HTML из строки

Описание

public bool DOMDocument::loadHTML ( string $source [, int $options = 0 ] )

Функция разбирает HTML содержащийся в строке source. В отличие от XML, HTML не обязан быть правильно построенным документом. Эта функция также может быть вызвана статически для загрузки и создания объекта класса DOMDocument. Статический вызов может использоваться в случаях, когда нет необходимости устанавливать значения параметров объекта DOMDocument до загрузки документа.

Список параметров

source

HTML строка.

options

Начиная с версии PHP 5.4.0 и Libxml 2.6.0, можно также использовать параметр options для передачи дополнительных параметров Libxml.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. В случае статического вызова возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано библиотечными обработчиками ошибок.

Этот метод может быть вызван статически, но при этом будет сгенерирована ошибка уровня E_STRICT.

Несмотря на то, что некорректный HTML обычно успешно загружается, данная функция может генерировать ошибки уровня E_WARNING при обнаружении плохой разметки. Для обработки данных ошибок можно воспользоваться функциями обработки ошибок libxml.

Примеры

Пример #1 Создание документа

<?php
$doc 
= new DOMDocument();
$doc->loadHTML("<html><body>Test<br></body></html>");
echo 
$doc->saveHTML();
?>

Список изменений

Версия Описание
5.4.0 Добавлен параметр options.

Смотрите также

  • DOMDocument::loadHTMLFile() - Загрузка HTML из файла
  • DOMDocument::saveHTML() - Сохраняет документ из внутреннего представления в строку, используя HTML форматирование
  • DOMDocument::saveHTMLFile() - Сохраняет документ из внутреннего представления в файл, используя HTML форматирование

add a note add a note

User Contributed Notes 14 notes

up
87
mdmitry at gmail dot com
7 years ago
You can also load HTML as UTF-8 using this simple hack:

<?php

$doc
= new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);

// dirty fix
foreach ($doc->childNodes as $item)
    if (
$item->nodeType == XML_PI_NODE)
       
$doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

?>
up
49
Shane Harter
7 years ago
DOMDocument is very good at dealing with imperfect markup, but it throws warnings all over the place when it does.

This isn't well documented here. The solution to this is to implement a separate aparatus for dealing with just these errors.

Set libxml_use_internal_errors(true) before calling loadHTML. This will prevent errors from bubbling up to your default error handler. And you can then get at them (if you desire) using other libxml error functions.

You can find more info here http://www.php.net/manual/en/ref.libxml.php
up
3
finkenb2 at mail dot lib dot msu dot edu
2 years ago
Warning:  This does not function well with HTML5 elements such as SVG.  Most of the advice on the Web is to turn off errors in order to have it work with HTML5.
up
11
bigtree at DONTSPAM dot 29a dot nl
12 years ago
Pay attention when loading html that has a different charset than iso-8859-1. Since this method does not actively try to figure out what the html you are trying to load is encoded in (like most browsers do), you have to specify it in the html head. If, for instance, your html is in utf-8, make sure you have a meta tag in the html's head section:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>

If you do not specify the charset like this, all high-ascii bytes will be html-encoded. It is not enough to set the dom document you are loading the html in to UTF-8.
up
25
hanhvansu at yahoo dot com
10 years ago
When using loadHTML() to process UTF-8 pages, you may meet the problem that the output of dom functions are not like the input. For example, if you want to get "Cạnh tranh", you will receive "Cạnh tranh".  I suggest we use mb_convert_encoding before load UTF-8 page :
<?php
    $pageDom
= new DomDocument();   
   
$searchPage = mb_convert_encoding($htmlUTF8Page, 'HTML-ENTITIES', "UTF-8");
    @
$pageDom->loadHTML($searchPage);

?>
up
3
kerim-yagmurcu at gmx dot de
11 months ago
For those of you who want to get an external URL's class element, I have 2 usefull functions. In this example we get the '<h3 class="r">'
elements back (search result headers) from google search:

1. Check the URL (if it is reachable, existing)
<?php
# URL Check
function url_check($url) {
   
$headers = @get_headers($url);
    return
is_array($headers) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$headers[0]) : false;
};
?>

2. Clean the element you want to get (remove all tags, tabs, new-lines etc.)
<?php
# Function to clean a string
function clean($text){
   
$clean = html_entity_decode(trim(str_replace(';','-',preg_replace('/\s+/S', " ", strip_tags($text)))));// remove everything
   
return $clean;
    echo
'\n';// throw a new line
}
?>

After doing that, we can output the search result headers with following method:
<?php
$searchstring
= 'djceejay';
$url = 'http://www.google.de/webhp#q='.$searchstring;
if(
url_check($url)){
   
$doc = new DomDocument;
   
$doc->validateOnParse = true;
   
$doc->loadHtml(file_get_contents($url));
   
$output = clean($doc->getElementByClass('r')->textContent);
    echo
$output . '<br>';
}else{
    echo
'URL not reachable!';// Throw message when URL not be called
}
?>
up
8
Errol
8 years ago
It should be noted that when any text is provided within the body tag
outside of a containing element, the DOMDocument will encapsulate that
text into a paragraph tag (<p>).

For example:
<?php
$doc
= new DOMDocument();
$doc->loadHTML("<html><body>Test<br><div>Text</div></body></html>");
echo
$doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>Test<br></p>
<div>Text</div>
</body></html>

while:
<?php
$doc
= new DOMDocument();
$doc->loadHTML(
   
"<html><body><i>Test</i><br><div>Text</div></body></html>");
echo
$doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<i>Test</i><br><div>Text</div>
</body></html>
up
3
jamesedwardcooke+php at gmail dot com
9 years ago
Using loadHTML() automagically sets the doctype property of your DOMDocument instance(to the doctype in the html, or defaults to 4.0 Transitional). If you set the doctype with DOMImplementation it will be overridden.

I assumed it was possible to set it and then load html with the doctype I defined(in order to decide the doctype at runtime), and ran into a huge headache trying to find out where my doctype was going. Hopefully this helps someone else.
up
6
cake at brothercake dot com
4 years ago
Be aware that this function doesn't actually understand HTML -- it fixes tag-soup input using the general rules of SGML, so it creates well-formed markup, but has no idea which element contexts are allowed.

For example, with input like this where the first element isn't closed:

    <span>hello <div>world</div>

loadHTML will change it to this, which is well-formed but invalid:

    <span>hello <div>world</div></span>
up
4
xuanbn at yahoo dot com
10 years ago
If you use loadHTML() to process utf HTML string (eg in Vietnamese), you may experience result in garbage text, while some files were OK. Even your HTML already have meta charset  like

  <meta http-equiv="content-type" content="text/html; charset=utf-8">

I have discovered that, to help loadHTML() process utf file correctly, the meta tag should come first, before any utf string appear. For example, this HTML file

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title> Vietnamese - Tiếng Việt</title>
  </head>
<body></body>
</html>

will be OK with loadHTML() when <meta> tag appear <title> tag.

But the file below will not regcornize by loadHTML() because <title> tag contains utf string appear before <meta> tag.

<html>
<head>
    <title> Vietnamese - Tiếng Việt</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
<body></body>
</html>
up
2
romain dot lalaut at laposte dot net
10 years ago
Note that the elements of such document will have no namespace even with <html xmlns="http://www.w3.org/1999/xhtml">
up
3
piopier
8 years ago
Here is a function I wrote to capitalize the previous remarks about charset problems (UTF-8...) when using loadHTML and then DOM functions.
It adds the charset meta tag just after <head> to improve automatic encoding detection, converts any specific character to an html entity, thus PHP DOM functions/attributes will return correct values.

<?php
mb_detect_order
("ASCII,UTF-8,ISO-8859-1,windows-1252,iso-8859-15");
function
loadNprepare($url,$encod='') {
       
$content        = file_get_contents($url);
        if (!empty(
$content)) {
                if (empty(
$encod))
                       
$encod  = mb_detect_encoding($content);
               
$headpos        = mb_strpos($content,'<head>');
                if (
FALSE=== $headpos)
                       
$headpos= mb_strpos($content,'<HEAD>');
                if (
FALSE!== $headpos) {
                       
$headpos+=6;
                       
$content = mb_substr($content,0,$headpos) . '<meta http-equiv="Content-Type" content="text/html; charset='.$encod.'">' .mb_substr($content,$headpos);
                }
               
$content=mb_convert_encoding($content, 'HTML-ENTITIES', $encod);
        }
       
$dom = new DomDocument;
       
$res = $dom->loadHTML($content);
        if (!
$res) return FALSE;
        return
$dom;
}
?>

NB: it uses mb_strpos/mb_substr instead of mb_ereg_replace because that seemed more efficient with huge html pages.
up
0
fr at felix-riesterer dot de
1 year ago
Remember: If you use an HTML5 doctype and a meta element like so

<meta charset=utf-8">

your HTML code will get interpreted as ISO-8859-something and non-ASCII chars will get converted into HTML entities. However the HTML4-like version will work (as has been pointed out 10 years ago by "bigtree at 29a"):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
up
-1
Alex
7 years ago
Beware of the "gotcha" (works as designed but not as expected): if you use loadHTML, you cannot validate the document. Validation is only for XML. Details here: http://bugs.php.net/bug.php?id=43771&edit=1
To Top