2009-08-04 36 views
3

我正在尋找做某種「智能」HTML編碼的最佳方式。 例如:智能HTML編碼

From: <a>Next >></a> to: <a>Next gt;gt;</a> 
From: <p><a><b><< Prev</b></a><br/><a>Next >></a></p> to: <p><a><b>&lt;&lt; Prev</b></a><br/><a>Next gt;gt;</a></p> 

所以只有文本的非XML/HTML部分將彷彿的HTMLEncode被稱爲編碼。

有什麼建議嗎?

編輯:這應該儘可能輕。傳入的文本將來自不知道HTML編碼的用戶。

+2

智能將「編寫HTML」或「編寫純文本」 - 嘗試啓發式地確定字符串的哪些部分是HTML,哪些是使用在HTML中具有特殊含義的字符的文本* hard *(並且可能不可能以100%的可靠性)。 – Quentin 2009-08-04 13:32:14

+0

是的,我不是在尋找一個完美的解決方案。事情是用戶可以選擇插入一些帶有HTML標籤的文本。但是它們被用來插入不是HTML的東西,比如>>。所以我必須儘量確保最終的內容是確定的。很難向用戶解釋他們應該使用>和<。 – Drejc 2009-08-04 13:39:36

回答

-4

我可能會嘗試爲此寫一個好的正則表達式。你是在代碼背後(C#)還是在客戶端使用JavaScript?

http://www.regular-expressions.info/

+0

嘗試使用正則表達式來解析非常規數據並不是解決此問題的最佳方法。最好的方法是直接操作DOM,這已經被陳述過了。 – Xetius 2009-08-04 13:36:00

6

是:不要永遠寫HTML到您的源代碼。而是使用像DOM這樣的API來處理所有編碼問題。

+0

當然,如果這個內容已經存在,並且你不能更改生成器,那麼你仍然試圖自己操縱內容。你可能想嘗試某種形式的詞法分析。在任何情況下都不要嘗試使用正則表達式。至少,不是如果你想保持你的理智。 – Xetius 2009-08-04 13:38:29

2

如果你想要一個堅實可靠的C#解決方案(但重量很大),那麼我會使用HTML Agility Pack library。然後,您可以遍歷節點並對內容進行HTML編碼。這比正則表達式有點防彈,但顯然更強烈。

如果你想做它的客戶端,然後使用JQuery。見Encode HTML entities with jQuery

0

您可能正在嘗試解決錯誤的問題。 (我知道這是不是你想聽到什麼。)

如果允許用戶編寫未編碼>><<成HTML那麼想必他們也能寫<><b>,而在這種情況下,沒有辦法你可以可靠地區分文字和標記。 (不要緊,這會讓你容易受到XSS攻擊。)

你真的必須截取文本並對它進行編碼之前它被插入到HTML中。可能你應該解釋導致你問題的工作流程。必須有更好的方法來解決它。

編輯迴應評論:根本沒有辦法可靠地編碼輸入,可以是文本或HTML在同一時間。無論如何,如果用戶在技術上足以輸入原始HTML,那麼他們大概可以編寫實體 - 否則不應該首先輸入原始HTML。如果HTML輸入僅適用於高級用戶,那麼您可以選擇一個複選框,指示輸入是文本還是HTML。但你應該看看使用富文本編輯器。

0

您是否想過使用tidy.net?你可以把你的用戶輸入放到那裏,看看它出現了什麼,它非常非常好,並將垃圾轉化爲你實際需要的東西。它是一個DLL和所有託管代碼,我相信您可以輕鬆地將其插入。

至於no to regexp樂隊的旅行車,我不同意。如果數據是有限的(你不會說是否是),那麼你可以想出一些規則,如果沒有清理它,至少會試圖驗證你輸入的字符串。我懷疑,儘管你的數據實際上可能是任何情況下,你會更好地使用其他的東西,但它不應該完全排除。