2009-12-01 65 views
4

我有以下的正則表達式驗證檢測輸入字符串是否包含HTML/script標籤,如果是導致vaidation錯誤:asp.net正則表達式驗證客戶端腳本錯誤

<asp:TextBox ID="txt" runat="server" /> 
    <asp:RegularExpressionValidator 
     ControlToValidate="txt" 
     runat="server" 
     ID="regexVal" 
     EnableClientScript="true" Display="Dynamic" 
     ErrorMessage="Invalid Content" 
     Text="!" 
     ValidationExpression=">(?:(?<t>[^<]*))" /> 

當我運行託管這個標記的頁面我得到了一條scipt錯誤消息「正則表達式中的語法錯誤」。 然而,當我採取相同的正則表達式,並使用從System.Text.RegularExpressions一切正則表達式類中運行正常工作: 像這樣:

Regex r = new Regex(">(?:(?<t>[^<]*))"); 
r.IsMatch(@"<b>This should cause a validation error</b>"); 
r.IsMatch("this is fine"); 

我缺少什麼

UPDATE: 的錯誤似乎是發生在下面的js函數中的WebResource.axd:

function RegularExpressionValidatorEvaluateIsValid(val) { 
    var value = ValidatorGetValue(val.controltovalidate); 
    if (ValidatorTrim(value).length == 0) 
     return true; 
    var rx = new RegExp(val.validationexpression); //this is the line causing the error 
    var matches = rx.exec(value); 
    return (matches != null && value == matches[0]); 
} 
+0

我沒有問題在運行您的代碼,您使用的是哪種瀏覽器? – 2009-12-01 07:04:55

+0

FF 3.5和IE 8.當默認瀏覽器設置爲IE並且項目在調試模式下運行時,會引發腳本錯誤。 – 2009-12-01 07:26:21

+0

對我來說工作也很好。 – 2009-12-01 07:30:44

回答

11

我認爲問題在於JavaScript不理解用於分組的.NET正則表達式語法。

當您在RegularExpressionValidator上將EnableClientScript設置爲true時,ASP.NET將在JavaScript中重新創建您的正則表達式,以啓用對您的控件的客戶端驗證。在這種情況下,JavaScript不支持命名組(?<t>...)和非捕獲組(?:...)的語法。雖然這些功能在.NET中運行,但JavaScript正在與他們拼搏。

RegularExpressionValidator Control (General Reference) on MSDN

On the client, JScript regular expression syntax is used. On the server, Regex syntax is used. Because JScript regular expression syntax is a subset of Regex syntax, it is recommended that you use JScript regular expression syntax in order to yield the same results on both the client and the server.

有兩種方法可以解決此:

  1. 禁用客戶端腳本生成和對服務器端的正則表達式execue。您可以將EnableClientScript設置爲false
  2. 修改正則表達式並刪除非捕獲組和命名組。如果您需要使用正則表達式進行捕獲,則(...)語法在JavaScript和.NET中都應該可以正常工作。然後,您將使用序號參考來訪問捕獲的值($1,$2等)。像>[^<]*這樣的應該按預期工作。見Grouping Constructs on MSDN

我想指出幾個其他問題:

  • 你原來的正則表達式似乎並不需要在所有拍攝,如果你想要做的是檢查存在一個開角尖括號。它可以被重寫爲>[^<]*這將更簡單並且以完全相同的方式工作。它不會捕獲原始字符串中的任何值,但由於您在ASP.NET驗證控件中使用它,因此這應該不重要。
  • 只有匹配成功,您執行RegularExpressionValidator的方式纔會有效。在你的情況下,如果你的文本框包含諸如>blah之類的東西,你的驗證將會通過。我想你想讓它反過來工作。
  • 如果將正則表達式修改爲>[^<]*,那麼正則表達式仍然無法正常工作,因爲我認爲您打算如此。驗證控件嘗試匹配文本框中的所有文本。因此,如果我在文本框中輸入>blah,它將匹配,但<b>blah</b>不會,因爲正則表達式表示該字符串必須以>開頭。我會建議嘗試像.*>.*[^<]*之類的文本,以允許>之前的文本。
+0

你在那裏的好處。 +1 – 2009-12-01 08:05:58

+0

感謝您的澄清。這現在很有意義。我仍然希望得到一個與原始正則表達式相同的最終結果的等效正則表達式,即檢測HTML標記/內容,以便我可以將其標記爲驗證錯誤。有任何想法嗎? – 2009-12-02 04:03:38

+1

'[^ <>] *'可能是您的'RegularExpressionValidator'的起點。它會嘗試匹配包含除角尖括號之外的任何字符串。請注意,使用正則表達式解析HTML通常是一個糟糕的主意:http://stackoverflow.com/questions/1816255/when-is-it-wise-to-use-regular-expressions-with-html(偉大的鏈接在那問題 - 跟隨他們好!)。在這種情況下,在輸入中檢測HTML可能是好的,雖然... – dariom 2009-12-02 07:12:09

1

我設法找到問題的根源,但不知道究竟能解決。

在FF3.5用Firebug控制檯,運行此觸發所有的客戶端驗證:

for(var _v=0; _v<Page_Validators.length; _v++){ 
    ValidatorValidate(Page_Validators[_v]); 
} 

然後輸入一些文本到文本框txt並再次運行該腳本,則會引發異常:
「無效量詞?[^ <] *))」

不知何故,正則表達式字符串不能由瀏覽器的正則表達式引擎解析。我一直無法找到替代正則表達式。

+0

我想知道這是否是一個ASP.NET錯誤,爲正則表達式發佈javascript,正如我在更新中提到的那樣,下面一行是炸彈: var rx = new RegExp(val.validationexpression); – 2009-12-01 07:47:46

+0

我建議改爲替代正則表達式或僅使用服務器端驗證。我也有一些瀏覽器的regex兼容性問題。 – 2009-12-01 07:59:46

1

這並獲得成功對我來說:

(^[^<>]*$)|(^[^>]*$)|(^[^<]*$) 

我希望讓用戶能夠使用一個<或>但不是。 (這並不能對>什麼<,但我可以忍受)

0

由於dariom ......這似乎是簡潔的作品... [正則表達式(@ 「[^ <>] *」 的ErrorMessage = 「沒有腳本代碼時,請」)

0

你應該試試這個 正則表達式R =新的正則表達式(@ 「>(([^ <] *)?)」);