2010-04-27 39 views
0

我想要拿出一個驗證表達式,以防止用戶輸入html或javascript標籤到網頁的評論框中。負面展望排除HTML標記

下工作正常,文字的一行:

^(?!.*(<|>)).*$ 

..但它不會允許因爲點中的任何換行符()。如果我像這樣的東西去:

^(?!.*(<|>))(.|\s)*$ 

這將允許多個線,但表達只匹配「<」和「>」在第一行。我需要它來匹配任何線。

這工作得很好:

^[-_\s\d\w&quot;'\.,:;#/&\$\%\[email protected]\+\*\\(\)]{0,4000}$ 

,但它的醜陋,我擔心它會打破一些用戶,因爲它是一個多語種的應用程序。

任何想法?謝謝!

+0

人們總是這樣對我,當我問正則表達式爲html - '使用分析器:) :)好吧,現在認真:你需要說一些關於你使用的技術。你確定\ w會得到非拉丁字母或奇怪的字母嗎?你可以用我的'ąćęłóńśżź'作爲開始餵食 – naugtur 2010-04-27 21:48:29

+0

調用食譜.... – 2010-04-27 21:58:47

+0

好的,我沒有包含任何有關該技術的信息,因爲我當時並不認爲它是相關的。我想是的。 正則表達式將用於ASP.Net頁面上的RegularExpressionValidator標記。所以我們的目標是在表單提交給服務器之前驗證標籤不存在,即客戶端。 – Remoh 2010-04-28 18:07:23

回答

1

請注意,您的RE可以防止用戶在任何情況下輸入<>。例如,「2 > 1」。這是非常不可取的。

而不是試圖用regular expressions to match HTML(它們不太適合做),簡單地通過它們轉換到&lt;&gt;逃脫<>。或者,爲您的語言選擇一個實現白名單的軟件包,以允許HTML的有限子集,或支持其自己的標記語言(我聽說markdown很好)。

至於「。」不匹配換行符,一些正則表達式實現支持一個標誌(通常「m」表示「多行」,「s」表示「單行」;後者導致「。」匹配換行符)來控制這種行爲。

前兩個基本上相當於/^[^<>]*$/,除了這個工作在多行字符串。你爲什麼沒有這樣寫RE?

+0

該應用程序的DAL已經處理了任何「危險」字符的轉義,但我寧願在兩個地方都這樣做。我在過去也注意到,客戶端的ASP.Net驗證器往往會窒息任何看起來像標籤的東西,所以我也試圖避免這種情況。 – Remoh 2010-04-28 18:08:51

+0

我知道,到目前爲止,我所展示的內容將阻止任何'<' and '>'的使用,並且我計劃在得到否定性工作後解決這個問題。我會檢查一下是否有多行標誌。 – Remoh 2010-04-28 18:09:41

0

因此,我研究了它,並且導致「。」的正則表達式存在.Net'SingleLine'選項。以匹配新的一行字符。不幸的是,這在ASP.Net RegularExpressionValidator中不可用。據我所知,沒有辦法做出像^(?!(< \ w +>))的東西。 $在不進行服務器端驗證的情況下工作在多行文本框中。

我接受了你的建議,並走了逃避服務器端標籤的路線。這需要將驗證頁指令設置爲'假',但在這個特殊的實例中,這並不是什麼大問題,因爲評論框是真正唯一需要擔心的。