簡體   English   中英

使用正則表達式和php匹配未關閉的html標簽

[英]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驗證的庫。 看到這些問題:

刪除字符串中不匹配的HTML標記

如何找到未閉合的div標簽

PHP以字符串形式獲取所有未關閉的HTML標記

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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