我有一個字符串作爲HTML源,我想檢查是否字符串的HTML源代碼包含未打開的標籤。檢查未打開的標籤的HTML字符串
例如下面的字符串包含</u>
之後的WAVEFORM沒有開放<u>
。
WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,
我只是想檢查這些類型的未開封的標籤,然後我不得不打開標籤附加到字符串的開始?
我有一個字符串作爲HTML源,我想檢查是否字符串的HTML源代碼包含未打開的標籤。檢查未打開的標籤的HTML字符串
例如下面的字符串包含</u>
之後的WAVEFORM沒有開放<u>
。
WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,
我只是想檢查這些類型的未開封的標籤,然後我不得不打開標籤附加到字符串的開始?
對於這種特定情況,如果HTML格式正確或者您的標籤未打開,您可以使用HTML Agility Pack來斷言。
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以查看是否有開始或結束標記。 (或者你可以忽略的評論。)
如果你有一個開始標籤,你需要知道它是否需要關閉,即。如果它是<img>
之類的EMPTY
內容模型標記之一。如果一個元素是EMPTY
,它不需要關閉,所以你可以忽略它。 (如果您有XHTML,則會更容易一些。)
如果您有開始標記,請將正則表達式組中的標記名稱添加到標記關閉列表中。如果你有一個結束標籤,從標籤到結束列表的末尾取一個標籤(它應該與標籤名稱相同,否則你的標籤無效)。如果沒有標籤標籤 - 關閉列表,而是將標籤名稱添加到標籤打開列表中
一旦您到達輸入字符串的末尾,請將每個標籤打開標籤添加到字符串以相反的順序,並追加標籤 - 關閉到結束,再次以相反的順序。
(是的,我解析HTML與正則表達式。我認爲這種無效性爲什麼你不想要,如果有什麼可以做的,以避免已經在標籤的中間刪除了標記,那就這麼做)。
html標記和正則表達式不是一個好主意 – 2010-07-02 13:56:21
天哪,真的,你覺得呢? – bobince 2010-07-02 16:46:59