Как предотвратить 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