簡體   English   中英

PHP:解析HTML時xml_parser“標簽不匹配”錯誤(自動關閉標簽為 <img> )?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM