2008-12-23 60 views
4

我試圖將包含HTML標記的HTML字符串中的>字符的所有實例轉換爲與其等效的HTML實體>。我用這個解決方案得到的最遠距離是使用正則表達式。轉換爲HTML字符串中的HTML實體

這是我到目前爲止有:

 public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline); 

我在被隔離單>字符不是一個HTML標記的一部分的主要問題。我不想轉換任何現有的標籤,因爲我需要保留HTML進行渲染。如果我不轉換>字符,我會得到格式不正確的HTML,這會在瀏覽器中導致呈現問題。

這是一個測試字符串的示例來解析:

"Ok, now I've got the correct setting.<br/><br/>On 12/22/2008 3:45 PM, [email protected] wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > [email protected] wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>" 

在上述字符串中,沒有>字符是HTML標記的部分的應轉換爲>。所以,這樣的:

<div class"quotedReply">> 

應成爲這樣:

<div class"quotedReply">&gt; 

另一個問題是,上面的表達式使用非捕獲基團,其是除了一個事實,即匹配是在第1組細。我不太清楚如何僅替換第一組,並保留比賽的其餘部分。看起來MatchEvaluator並沒有真正做到這一點,或者我現在無法想象它。

我懷疑我的正則表達式可以做一些喜歡'。

任何人有任何明智的想法?

+0

有點有趣這裏...我想你的例子吃了。當你想逐字粘貼某些東西時,你應該在編輯器中檢查「代碼示例」按鈕。即使我不得不回去編輯我的答案,因爲我使用了&GT,它翻譯了它...... :) – LarryF 2008-12-23 22:37:50

+0

哦,諷刺。 :) – 2008-12-23 23:05:34

回答

3

關鍵是要抓住一切不是目標,然後修改文本插回順,就像這樣:

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1&gt;"); 

但安東尼的權利:文本節點右尖括號不應該引起任何問題。將HTML與正則表達式匹配很棘手;例如,評論和CDATA幾乎可以包含任何東西,所以一個強大的正則表達式將不得不專門匹配它們。

1

也許將您的HTML讀取到XML解析器中,該解析器應該爲您處理轉換。

+0

我不確定這是做他正在做的事情的正確方法。 – LarryF 2008-12-23 22:39:26

0

您是在談論HTML標記內的字符(如Java的innerText中)還是HTML標記的參數列表中?

如果您只想對開始和結束標記之間的文本進行消毒,那應該相當簡單。只需找到任何>字符,並用& gt;代替它。 (我也會用& lt標籤),但HTML渲染引擎應該爲你照顧這個...

舉一個你正在試圖淨化的例子,也許我們找一個最好的解決方案。

拉里

+0

我正在談論不屬於HTML標籤的字符,包括組成標籤的字符。 – 2008-12-23 22:30:24

0

,你可以讀取字符串轉換爲XML文檔,並期待在價值觀,並與值&gt;更換>。這需要遞歸地進入文檔中的每個節點,但這不應該太難。

+0

我想到了這個使用HTML解析器。我遇到的問題是,並非所有東西都在節點內,所以它放棄了所有不在節點之間的文本。 – 2008-12-23 22:29:36

+0

哪裏不是一個HTML標記的一部分,而不是在一個節點內? – 2008-12-24 03:55:15

0

Steve_C,你可以試試這個RegEx。這將在參考文獻1中捕獲任何HTML標籤,並且標籤之間的文本存儲在捕獲文件2中。我沒有完全測試這個,只是把它扔到那裏以防萬一它有幫助。

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1> 
4

爲什麼要這樣做? >正在做什麼?我遇到的大多數解析器都很喜歡a>,而不需要將它轉義爲實體。

此外,在將它們與包含HTML標記的字符串連接在一起之前,先用HtmlUtilty.HtmlEncode對內容字符串進行正確編碼會更合適,因此如果這在您的控制之下,您應該考慮在那裏處理它。