2010-12-02 58 views
2

我有一個多行文本框(textarea),我想驗證它有一個特定的字符串。我試圖:RegularExpressionValidator多行文本框緩慢(textarea)

<asp:RegularExpressionValidator runat="server" ControlToValidate="txtTemplate" ValidationExpression="^(.\s*)*Content(.\s*)*$" Text="content" ErrorMessage="Must contain: Content" /> 

使用^(.\s*)*$似乎傳遞一個textarea。所以我試圖在兩個這樣的標準之間夾雜我的標準。但它似乎鎖定了IE和Chrome。

這應該很簡單,我認爲我要比它更強硬。

回答

4

如果驗證總是在服務器上完成(這就是runat="server"手段,是不是?),最簡單的解決辦法可能是使用這個表達式:

(?s)^.*Content.*$ 

(?s)打開Singleline模式,該模式允許.元字符匹配所有字符,包括換行符。如果你想讓它在客戶機上運行良好,使用此:

^[\s\S]*Content[\s\S]*$ 

這是因爲JavaScript有沒有類似Singleline模式(也稱爲DOT_ALLDOTALL點百搭單行/s模式)。它不識別內聯修飾符,如(?s)(?i)

小心諸如(.\s*)*這樣的結構,其中帶量詞的表達式(*,+等)包含在本身由量詞控制的組中。如果正則表達式無法立即實現匹配,它會返回並嘗試通過不同的路徑進行匹配(即,通過使用正則表達式的不同部分來匹配字符串的不同部分),這會在性能方面變得非常昂貴。這個正則表達式特別糟糕,因爲.\s可以匹配許多相同的字符,這大大增加了在放棄之前必須探索的路徑數量。

這種現象通常被稱爲catastrophic backtracking,它通常表現在無法匹配的情況下。當期望序列Content存在時,我希望驗證程序能正常工作。

順便說一句,如果你想匹配只能在完整的單詞Content,你應該添加單詞邊界,就像這樣:

(?s)^.*\bContent\b.*$ 

這將防止像MalContentContentious話誤報。 \b在不同的正則表達式中有不同的作用。在.NET中,除非指定了ECMAScript模式,否則它是可識別Unicode的。在JavaScript中,它應該只識別ASCII字母和數字作爲單詞字符;在大多數瀏覽器中都是這樣,但不要認爲它是理所當然的。

+0

真棒的答案。我使用[\ s \ S]選項,因爲我希望它在客戶端運行(runat =「server」表示服務器必須解釋標記,EnableClientScript =「false」只會在服務器上運行) 。 – Eric 2010-12-03 16:18:32

0

我認爲更像.*Content.*的正則表達式會更有效,可能更快。另外,如果這仍然是一個性能拖動,您可能需要實現一個自定義驗證器,在這裏您使用JavaScript來搜索字符串的文本。

+0

不起作用。這段時間並不符合換行符,這就是爲什麼我包含「\ s」(空格)的原因。我可以做一個自定義驗證器,但這就像八行代碼:) – Eric 2010-12-02 17:43:56

1

嘗試

[\S\s]*Content[\S\s]*