gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:55:34 25 4
gpt4 key购买 nike

我有以下正则表达式验证器来检测输入字符串是否包含 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 用于分组的正则表达式语法。

当您设置 EnableClientScripttrueRegularExpressionValidator 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.



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


  • 我想指出另外几个问题:
  • 如果您想做的只是检查是否存在左尖括号,那么您原来的正则表达式似乎根本不需要捕获。它可以重写为 >[^<]*这将更简单并且以完全相同的方式工作。它不会捕获原始字符串中的任何值,但由于您在 ASP.NET 验证控件中使用它,因此这无关紧要。
  • 您实现 RegularExpressionValidator 的方式只有在匹配成功时才会起作用。在您的情况下,如果您的文本框包含类似 >blah 的内容,您的验证将通过。 .我认为你希望它以相反的方式工作。
  • 如果将正则表达式修改为 >[^<]* ,正则表达式仍然无法按照我认为的方式工作。验证控件尝试匹配文本框中的所有文本。所以如果我输入 >blah在文本框中,它将匹配,但 <b>blah</b>不会,因为正则表达式说字符串必须以 > 开头.我建议尝试类似 .*>.*[^<]* 的方法允许在 > 之前的文本.
  • 关于.net - asp.net 正则表达式验证器客户端脚本错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824403/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com