asp.net正则表达式验证器客户端脚本错误

时间:2009-12-01 06:43:16

标签: .net asp.net regex

我有以下正则表达式验证程序来检测输入字符串是否包含HTML /脚本标记,如果是,则会导致更改错误:

<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类运行它时,一切正常: 像这样:

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

我缺少什么

更新: 该错误似乎发生在WebResource.axd中的以下js函数中:

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]);
}

4 个答案:

答案 0 :(得分:11)

我认为问题在于JavaScript无法理解.NET的正则表达式语法以进行分组。

EnableClientScript上将true设置为RegularExpressionValidator时,ASP.NET会在JavaScript中重新创建正则表达式,以便对您的控件启用客户端验证。在这种情况下,JavaScript不支持命名组(?<t>...)和非捕获组(?:...)的语法。虽然这些功能在.NET中起作用,但JavaScript正在努力解决这些问题。

来自RegularExpressionValidator Control (General Reference) on MSDN

  

在客户端上,JScript是常规的   使用表达式语法。在   服务器,使用正则表达式语法。因为   JScript正则表达式语法是一个   正则表达式是Regex语法的子集   建议您使用JScript   正则表达式语法以便   两者产生相同的结果   客户端和服务器。

有两种方法可以解决这个问题:

  1. 禁用客户端脚本生成,并在服务器端使用正则表达式execue。您可以将EnableClientScript设置为false
  2. 来执行此操作
  3. 修改正则表达式并删除非捕获组和命名组。如果需要在正则表达式中捕获,(...)语法应该在JavaScript和.NET中都能正常工作。然后,您将使用序号引用来访问捕获的值($1$2等)。像>[^<]*这样的东西应该按预期工作。见Grouping Constructs on MSDN

  4. 我想指出其他几个问题:

    • 如果你想要做的就是检查是否存在开口尖括号,你原来的正则表达似乎根本不需要捕捉。它可以重写为>[^<]*,这将更简单,工作方式完全相同。它不会捕获原始字符串中的任何值,但由于您在ASP.NET验证控件中使用它,因此无关紧要。
    • 您实施RegularExpressionValidator的方式只有在匹配成功时才有效。在您的情况下,如果您的文本框包含>blah之类的内容,则会通过验证。我想你希望它以相反的方式工作。
    • 如果将正则表达式修改为>[^<]*,则正则表达式仍然无法正常运行。验证控件尝试匹配文本框中的所有文本。因此,如果我在文本框中输入>blah,它将匹配,但<b>blah</b>将不会,因为正则表达式表明该字符串必须以>开头。我建议尝试.*>.*[^<]*之类的内容,以便在>之前允许文字。

答案 1 :(得分:1)

我设法找到根本原因,但不确定究竟是什么决议。

在FF3.5中使用Firebug Console,运行此命令以触发所有客户端验证器:

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

然后在txt文本框中输入一些文本并再次运行脚本,抛出异常:
“无效的量词?[^&lt;] *))”

不知何故,浏览器的正则表达式引擎无法解析正则表达式字符串。我还没能找到替代正则表达式。

答案 2 :(得分:1)

这对我有用:

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

我想让用户能够使用一个&lt;或者&gt;但不是 。 (这确实会失败&gt;任何&lt;但我可以忍受它)

答案 3 :(得分:0)

你应该试试这个 正则表达式r =新的正则表达式(@“&gt;(?:(?[^&lt;] *))”);