2011-03-28 50 views
1

我一直試圖通過RegEx來工作,我可以使用它替換所有<和>文本字符串,但不包括那些字符串是HTML標記的一部分的情況。替換不屬於HTML標記的所有< and >

例如:

var str = "<p>The <b>value</b> <i>1</i> is < <u>2</u></p>" 

鑑於上面的例子中,我想看起來像這樣一個結果字符串:

var str = "<p>The <b>value</b> <i>1</i> is &lt; <u>2</u></p>" 
+2

閱讀[this](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454),然後考慮使用HTML Agility Pack 。 – 2011-03-28 18:55:49

+1

哈哈「用正則表達式解析HTML會讓感染靈魂進入生命的領域。」 – Sage 2011-03-28 19:10:08

回答

3

這並不容易。查看相關問題的權威答案here

正則表達式不是爲這種類型的解析而構建的。即使標記或dom解析也會導致問題。你的問題的標題說明了這個問題:

Replace all <and> that are NOT part of an HTML tag

解析器如何才能知道是否<and><AND>標籤,或者乾脆字and圍繞兩個孤兒尖括號?

HTML解析器可能是您最好的選擇,但如何處理孤兒括號是關鍵。此外,您還需要查找不匹配的標籤或非法標籤來查找問題標題等案例。

2

HTML是非常困難的使用正則表達式來解析。 HTML規範非常寬容,而且瀏覽器的實現往往更加寬容。這樣做的結果是,試圖僅僅使用正則表達式來匹配這樣的東西幾乎是不可能的。

它更強大的使用全面的HTML解析器,理解所有的特殊情況來生成一個DOM,然後遍歷生成的代碼中尋找尖括號的DOM。

正如你用.NET標記了你的問題,我可以推薦HTML Agility Pack來執行這種類型的任務。

-2

關於如何檢測HTML標記中或不在HTML文本中的問題,你應該能夠根據你的需要修改這個概念。

基本上,您正在尋找一個<,其後面跟着一個>,並且您想用符號註釋表單&lt;替換它。嘗試類似:

var output = Regex.Replace(input, "<(?!.*?[>])", "&lt;"); 
+1

而字符串'<'會發生什麼? – CanSpice 2011-03-28 19:05:43

+1

這將匹配上面示例中的每個<<;實際上,它將匹配整個字符串中的每個「<」到最終的「>」。這正是使正則表達式成爲HTML/XML錯誤工具的一種任務。 – 2011-03-28 19:08:43