我有以下正则表达式验证程序来检测输入字符串是否包含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]);
}
答案 0 :(得分:11)
我认为问题在于JavaScript无法理解.NET的正则表达式语法以进行分组。
在EnableClientScript
上将true
设置为RegularExpressionValidator
时,ASP.NET会在JavaScript中重新创建正则表达式,以便对您的控件启用客户端验证。在这种情况下,JavaScript不支持命名组(?<t>...)
和非捕获组(?:...)
的语法。虽然这些功能在.NET中起作用,但JavaScript正在努力解决这些问题。
来自RegularExpressionValidator Control (General Reference) on MSDN:
在客户端上,JScript是常规的 使用表达式语法。在 服务器,使用正则表达式语法。因为 JScript正则表达式语法是一个 正则表达式是Regex语法的子集 建议您使用JScript 正则表达式语法以便 两者产生相同的结果 客户端和服务器。
有两种方法可以解决这个问题:
EnableClientScript
设置为false
。(...)
语法应该在JavaScript和.NET中都能正常工作。然后,您将使用序号引用来访问捕获的值($1
,$2
等)。像>[^<]*
这样的东西应该按预期工作。见Grouping Constructs on MSDN。我想指出其他几个问题:
>[^<]*
,这将更简单,工作方式完全相同。它不会捕获原始字符串中的任何值,但由于您在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)