[英]PHP: xml_parser “Mismatched tag”-error when parsing HTML (auto-closing tags as <img>)?
我想使用PHP解析HTML。 我为此使用了xml_parser,但是它不能应付<img>
自动关闭标签。
例如,以下HTML代码段到达结束标记</a>
时会产生“不匹配的标记”错误:
<a>
<img src="URL"><br>
</a>
显然,原因是:xml_parser()不知道标签<img>
和<br>
不需要关闭(因为它们是自动关闭的)。
我知道我可以将HTML重写为<img src="URL"/><br/>
以使解析器满意。 但是,我希望解析器正确地正确处理这些HTML,因为上述变体将是有效的HTML。
所以我要么需要告诉解析器-在onOpeningTag中-此标记是否是自动关闭的。 这有可能吗? 另一种选择是告诉解析器自动关闭标签名称的列表。 但是,我没有找到任何功能。 因此,这种解析器可能不支持“ HTML”。
可以接受的解决方案可能是完全禁用标签不匹配检查(或自己实现HTML兼容版本)。
但是,我可能忽略了PHP中特定于HTML的版本。 有什么建议可以使用其他简单的解析器实现吗?
这是我到目前为止的内容:
<?php
// Command Line Parsing...
$file = $argv[1];
// Tag Handler functions
function onOpeningTag($parser, $name, $attrs) {
echo "OPEN: $name\n";
}
function onClosingTag($parser, $name) {
echo "CLOSE: $name\n";
}
function onContent($parser, $text) {
echo "TEXT (LEN:".strlen($text).")\n";
}
// Parser...
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "onOpeningTag", "onClosingTag");
xml_set_character_data_handler($xml_parser, "onContent");
if (!($fp = fopen($file, "r"))) die("Could not open file '$file'.\n");
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
fclose($fp);
xml_parser_free($xml_parser);
?>
您想使用XML解析器解析HTML,这很容易引起麻烦。 XML比HTML严格得多,您总是会遇到这样的问题。 如果您的HTML大小不是很大(例如几十MB,而是一个普通的网页),则可以使用DOM- http://php.net/manual/en/book.dom.php 。
$dom = new DOMDocument();
$dom->loadHtml($html);
$lists = $dom->getElementsByTagName('ul');
// bla bla bla
我的建议是尝试使用专门的HTML解析库。 以下是一些建议:
愿原力与你同在!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.