Как запретить PHP DomDocument «исправлять» вашу HTML-строку - PullRequest
8 голосов
/ 17 января 2012

Я пытался анализировать веб-страницы с помощью HTML-объекта DomObject, чтобы использовать их для приложения, чтобы сканировать их на предмет качества SEO.

Однако я столкнулся с проблемой.В целях тестирования я написал небольшую html-страницу, содержащую следующий неправильный html:

<head>
<meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>

Как вы можете видеть, заголовок находится вне тега head, это ошибка, которую я пытаюсь обнаружить.

Теперь возникает проблема, когда я использую curl, чтобы перехватить строку ответа с этой страницы, а затем отправляю ее в документ dom, чтобы загрузить ее в формате HTML, это фактически исправляется путем добавления других тегов вокруг заголовка.

<head>
<meta name="description" content="randomdesciption">
</head>
<head><title>sometitle</title></head>

Я проверил данные отклика скручивания, и это не является проблемой, так как php DomDocument во время выполнения метода loadHTML () исправляет синтаксис html.

Я также пытался отключить DomDocumentвосстановите, замените атрибуты и атрибуты validateOnParse, установив для них значение false без успеха.

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

Кто-нибудь знает, как предотвратить исправление DomDocument моего сломанного HTML?

Заранее спасибо

1 Ответ

7 голосов
/ 17 января 2012

ОБНОВЛЕНИЕ: начиная с PHP 5.4 вы можете использовать HTML_PARSE_NO_IMPLIED

$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);

Исходный ответ ниже

Вы не можете,В теории в libxml есть флаг HTML_PARSE_NO_IMPLIED, чтобы предотвратить добавление подразумеваемой разметки, но она недоступна из PHP.

В отношении sidenote это поведение, по-видимому, зависит отLIBXML_VERSION используется.

Запуск этого фрагмента:

<?php
$html = <<< HTML
<head>
<meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>
HTML;

$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->formatOutput = true;
echo $dom->saveHTML(), LIBXML_VERSION;

на моей машине даст

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta name="description" content="randomdesciption"></head>
<title>sometitle</title>
</html>
20707
...