【问题标题】:asp.net regular expression validator client side script errorasp.net 正则表达式验证器客户端脚本错误
【发布时间】:2009-12-01 06:43:15
【问题描述】:

我有以下正则表达式验证器来检测输入字符串是否包含 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]);
}

【问题讨论】:

  • 运行您的代码没有问题,您使用的是哪个浏览器?
  • FF 3.5 和 IE 8。默认浏览器设置为 IE 并且项目在调试模式下运行时抛出脚本错误。
  • 我认为这是因为在客户端 Regex 将在 JavaScript 中实现,因此 Regex 应该符合 JavaScript Regex Flavour。 JavaScript 不支持命名捕获,因此正则表达式应简化为 >(?:([^
  • @Huppie:是的。但是&gt;(?:([^&lt;]*)) 似乎也不起作用。你测试过吗?
  • EnableClientScript="true" 是默认值。

标签: .net asp.net regex


【解决方案1】:

我认为问题在于 JavaScript 不理解 .NET 用于分组的正则表达式语法。

当您在 RegularExpressionValidator 上将 EnableClientScript 设置为 true 时,ASP.NET 会在 JavaScript 中重新创建您的正则表达式,以对您的控件启用客户端验证。在这种情况下,JavaScript 不支持命名组 (?&lt;t&gt;...) 和非捕获组 (?:...) 的语法。虽然这些功能在 .NET 中有效,但 JavaScript 却在苦苦挣扎。

来自RegularExpressionValidator Control (General Reference) on MSDN

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

有两种方法可以纠正这个问题:

  1. 禁用客户端脚本生成并在服务器端执行正则表达式。您可以通过将EnableClientScript 设置为false 来做到这一点。
  2. 修改正则表达式,去掉非捕获组和命名组。如果您需要在正则表达式中捕获,(...) 语法应该在 JavaScript 和 .NET 中都能正常工作。然后,您将使用序号引用来访问捕获的值($1$2 等)。 &gt;[^&lt;]* 之类的东西应该可以按预期工作。见Grouping Constructs on MSDN

我想指出其他几个问题:

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

【讨论】:

  • 感谢您的澄清。现在这很有意义。我仍然希望获得一个等效的正则表达式,它可以实现与原始正则表达式相同的最终结果,即检测 html 标签/内容,以便我可以将其标记为验证错误。有什么想法吗?
  • [^&lt;&gt;]* 可能是您的RegularExpressionValidator 的起点。它将尝试匹配包含除尖括号之外的任何内容的字符串。请注意,使用正则表达式解析 HTML 通常是一个坏主意:stackoverflow.com/questions/1816255/…(该问题中的链接很好 - 很高兴关注它们!)。在这种情况下,检测输入中的 HTML 可能没问题...
  • 这不也能检测到小于和大于符号的匹配,例如“价格必须>40 和......”或“I'm bold”等输入被视为无效。
  • 这样的事情怎么样? ^.*.*$
  • 是的,我建议的正则表达式会阻止“价格 RegularExpressionValidator 有效(您必须反转正则表达式的逻辑 - 即您指定允许哪些模式 - 不允许)。您的表达式^.*&lt;\w+&gt;.*$ 不会阻止输入诸如“”之类的内容。此问题涉及您的 RegularExpressionValidator 控件中的错误。我会推荐一个新问题来找到合适的正则表达式模式来做你想做的事
【解决方案2】:

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

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

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

然后在txt文本框中输入一些文本并再次运行脚本,抛出异常:
"invalid quantifier ?[^

浏览器的正则表达式引擎无法解析正则表达式字符串。我还没有找到它的替代正则表达式。

【讨论】:

  • 我想知道这是否是 ASP.NET 在为正则表达式发出 javascript 时出现的错误,正如我在更新中提到的,以下行正在轰炸:var rx = new RegExp(val.验证表达式);
  • 我建议更改为替代正则表达式或仅使用服务器端验证。我也遇到了一些浏览器的正则表达式兼容性问题。
【解决方案3】:

这对我有用:

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

我想让用户能够使用一个 但不能。 (这在任何事情上都失败了

【讨论】:

    【解决方案4】:

    感谢dariom...这似乎很简洁并且有效... [RegularExpression(@"[^]*", ErrorMessage = "请不要使用 SCRIPT 标签。")]

    【讨论】:

      【解决方案5】:

      你应该试试这个 正则表达式 r = new Regex(@">(?:(?[^

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多