PHP:xml_parser&#34;解析HTML时标记错误&#34; -error(自动关闭标记为<img/>)?

时间:2014-10-28 14:10:02

标签: php html parsing xml-parsing html-parsing

我想用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);


?>

1 个答案:

答案 0 :(得分:2)

您希望使用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解析库。以下是一些建议:

愿力量与你同在!