加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 03:21:49 所属栏目:asp.Net 来源:网络整理
导读:我有以下正则表达式验证器来检测输入字符串是否包含 HTML /脚本标记,如果是这样,则会导致更改错误: asp:TextBox ID="txt" runat="server" / asp:RegularExpressionValidator ControlToValidate="txt" runat="server" ID="regexVal" EnableClientScript="tru
我有以下正则表达式验证器来检测输入字符串是否包含 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]);
}

解决方法

我认为问题是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.

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

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

我想指出其他几个问题:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读