[英]Checking a HTML string for unopened tags
我有一個字符串作為HTML源,我想檢查HTML源(字符串)是否包含未打開的標簽。
例如,下面的字符串在WAVEFORM后包含</u>
,而該<u>
沒有開頭。
WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,
我只想檢查未打開標簽的這些類型,然后將打開標簽附加到字符串的開頭?
對於這種特定情況,您可以使用HTML Agility Pack來斷言HTML的格式是否正確或是否未打開標簽。
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(
"WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,");
foreach (var error in htmlDoc.ParseErrors)
{
// Prints: TagNotOpened
Console.WriteLine(error.Code);
// Prints: Start tag <u> was not found
Console.WriteLine(error.Reason);
}
沒那么容易。 您不能直接使用HTML解析器,因為它不是有效的HTML,但是由於正則表達式不能應付嵌套或其他HTML復雜性,因此您不能輕易地將正則表達式整個扔掉。
您可能要做的最好的事就是使用正則表達式來找到每個標記結構,例如。 就像是:
<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->
從一個空的標簽打開列表和一個空的標簽關閉列表開始。 對於字符串中的每個匹配項,請查看第1組和第2組,以查看是否具有開始或結束標記。 (或您可以忽略的評論。)
如果您有一個開始標簽,則需要知道是否需要關閉。 如果它是EMPTY
內容模型標簽之一,例如<img>
。 如果元素為EMPTY
,則不需要關閉它,因此您可以忽略它。 (如果您擁有XHTML,這會更容易一些。)
如果您有開始標簽,則將正則表達式組中的標簽名稱添加到要關閉的標簽列表中。 如果您有結束標簽,請從標簽關閉列表的末尾刪除一個標簽(標簽名稱應與此處的標簽名稱相同,否則標記無效。如果標簽上沒有標簽)標簽關閉列表,而是將標簽名稱添加到標簽打開列表。
一旦到達輸入字符串的末尾,則將每個打開標簽的標簽以相反的順序添加到字符串中,然后將要關閉標簽的關閉標簽附加到末尾,再次相反訂購。
(是的,我正在用正則表達式解析HTML。我認為這很讓人討厭,這說明了您為什么不想這樣做。如果有什么可以做的事情,可以避免已經在標記中間剪斷您的標記,請執行此操作。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.