【问题标题】:RegularExpressionValidator Issue Limiting Max Characters In Textbox限制文本框中最大字符的 RegularExpressionValidator 问题
【发布时间】:2023-03-06 18:15:01
【问题描述】:

ASP.NET 4.5 / c#

我一直在为多行文本框使用 RegularExpressionValidator,如下所示:

<asp:RegularExpressionValidator
ID="rev_txtEducationProfessional_courseDescription"
runat="server"
Display="None"
ValidationGroup="educationProfessional"
ControlToValidate="txtEducationProfessional_courseDescription"
ValidationExpression="(\s|.){0,500}$"
ErrorMessage="Course Description: 500 characters maximum"
EnableClientScript="false" />

到目前为止,我还没有遇到任何问题,但我有一个问题,恕我直言,这很奇怪。因此,如果我在文本框中输入 501 字母 Xs,验证器会正常触发。如果我输入 499 个字母 Xs 和几个回车,验证器会正常触发。一位用户今天与我联系,提出网站挂起的问题。我将问题追溯到多行文本框的验证器。用户提交了超过 500 个字符,但网站在验证时挂起并崩溃。当我在调试中运行时,挂起的是 Page.Validate(您可能已经猜到了,我所有的验证都是服务器端的)。我将提供导致问题的文本。我应该注意,如果我在此文本中粘贴最多 500 个字符,一切都很好......一旦我点击 501,我的网站就会转储。结合我的验证方式“(\ s |。){0,500} $”,此文本有一些特定的内容,这是非常错误的,但我不知道确切的问题是什么。事不宜迟,这是我眼中的刺:


将有关摩擦脊识别的科学基础的详细讲座与密集的潜在打印比较实践练习相结合。讲座材料结合了大卫·阿什鲍的山脊学概念和帕特·韦特海姆开发的实用应用技术。

识别脊纹线索,识别哪个手指或皮肤的哪个区域产生了特定的潜在印象。第三级细节的正确使用。比较和识别潜在印刷品的哲学和 ACE-V 方法。


我尝试删除连字符。此外,文本来自 Word,因此我尝试复制到记事本以删除任何特殊格式并尝试删除回车。通常该站点会运行几分钟,然后说该页面不可用而没有特定错误。我刚刚尝试调试并且一直在等待似乎永远得到响应。如果有任何有用的东西我会补充。我很好奇我是否做了一些明显错误的事情,或者我可以通过修改正则表达式来解决这个问题。

谢谢大家!

【问题讨论】:

  • 我想知道从 Word 复制到记事本以尝试删除任何特殊字符是否不成功。我还没有尝试手动输入测试。如果可行,那么我可以逐段修改它以找到罪犯。不过,我希望有可以处理这个问题的验证(假设这是问题)。

标签: asp.net validation


【解决方案1】:

不确定其他人是否会遇到这个问题,但我已经看到这个 RegEx 多次引用来验证文本框长度:

ValidationExpression="(\s|.){0,500}$"

解决方法是使用这个:

ValidationExpression="^[\S\s]{1,500}$"

我不是正则表达式方面的专家,但发现了一篇非常有帮助的旧帖子。

您遇到的病理情况的原因,通常称为“灾难性”或“超线性”回溯。回溯如此昂贵(计算上)的原因是点匹配的字符和“\s”重叠(“\s”匹配的不仅仅是换行符),在这种情况下,这会导致回溯时要考虑选择点的数量以接近指数的速度爆炸。所以,这不是一个无限循环,但它可能需要到时间结束才能完成(如果您的服务器或客户端在此之前没有崩溃或死亡,这很有可能)。一些正则表达式库(例如 PCRE)对允许避免此类情况的回溯步骤数量设置了硬性上限,但这并不能真正解决问题。

http://regexadvice.com/forums/thread/37591.aspx

这是一个令人沮丧的故障排除问题。希望这对以后的人有所帮助。

保重。

【讨论】:

    【解决方案2】:

    是的,这可能是catastrophic backtracking。对于正则表达式(使用 .Net API 或 RegularExpressionValidator),您应该始终关注Best Practices for Regular Expressions in the .NET Framework

    作为一般建议,请尝试重写您的正则表达式模式(之前的答案可能解决了这个问题)。如果您对正则表达式模式在“最坏情况”情况下的性能有疑问,请使用 RegexBuddy 之类的工具进行测试。

    作为缓解措施,您还可以向验证器添加超时(MatchTimeout 属性,以毫秒为单位)。这个related post 还讨论了如何全局配置超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2016-06-17
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多