Как предотвратить PHP DomDocument от "фиксации" вашей строки HTML

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

однако я столкнулся с проблемой abit. Для целей тестирования я написал небольшую 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>

Я проверил данные ответа curl и что infact не проблема, каким-то образом php DomDocument во время выполнения метода loadHTML() исправляет синтаксис html.

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

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

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

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

1 ответов


UPDATE: начиная с PHP 5.4 вы можете использовать HTML_PARSE_NO_IMPLIED

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

оригинальный ответ ниже

вы не можете. В теории флаг HTML_PARSE_NO_IMPLIED для этого в libxml чтобы предотвратить добавление подразумеваемой разметки, но она недоступна из 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;

на моей машине будет дай!--9-->

<!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