簡體   English   中英

檢查HTML字符串中未打開的標簽

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

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