[英]Match unclosed html tags using regex and php
我使用php和regex在字符串中查找未關閉的html標記:
這是我的字符串:
$s="<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>";
您可以看到此處的所有標記均未關閉。
我想找到所有未關閉的標簽,但問題是我的正則表達式也匹配開始標簽。
到目前為止,這是我的正則表達式
/<[^>]+>/i
這是我的preg_match_all()函數
preg_match_all("/<[^>]+>/i",$s,$v);
print_r($v);
在正則表達式中我需要更改哪些內容才能匹配未關閉的標記?
<h2>
<p>
<div>
您可能沒有意識到這一點,但DOMDocument
可以幫助您修復HTML。
$html = "<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>";
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML('<root>' . $html . '</root>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach( $xpath->query('//*[not(node())]') as $node ) {
$node->parentNode->removeChild($node);
}
echo substr($dom->saveHTML(), 6, -8);
請參閱IDEONE演示
結果: <div><h2>Hello world</h2><p>It's 7Am where I live</p></div>
請注意,基於XPath的空節點清理是必要的,因為在將HTML加載到DOM后,DOM包含空<h2></h2>
, <p></p>
和<div></div>
標記。
<root>
元素在開頭添加,以確保我們獲得根元素。 之后,我們可以使用substr
進行后處理。
LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
標志是必需的,因此沒有DTD和其他垃圾沒有添加到DOM。
找到無與倫比的標簽似乎從根本上說很難用正則表達式。 您基本上需要將每個開始標記放到隊列中,然后在看到結束標記時將其從隊列中彈出。
建議您使用執行HTML驗證的庫。 看到這些問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.