【问题标题】:RegularExpression data annotation: Regex that matches all content that is not an HTML tag正则表达式数据注释:匹配所有非 HTML 标记内容的正则表达式
【发布时间】:2013-04-02 13:00:27
【问题描述】:

需要客户端对文本框进行不显眼的验证,以警告用户他键入了无效符号。我想在数据注释中使用正则表达式,像这样:

[Required]
[Display(Name = "RecordBody", ResourceType = typeof(Resources))]
[RegularExpression(@"(\<(/?[^\>]+)\>)", ErrorMessageResourceType = typeof(ValidationErrors), ErrorMessageResourceName = "DisallowHtml")]
[StringLength(8191, ErrorMessageResourceType = typeof(ValidationErrors), ErrorMessageResourceName = "TooLongEntry")]
public string Description { get; set; }

正则表达式在服务器端用于验证用户输入,并在客户端在 Javascript 正则表达式中使用:

<textarea cols="20" data-val="true" data-val-disallowhtml="Поле Текст записи содержит недопустимые символы" data-val-disallowhtml-pattern="(\<(/?[^\>]+)\>)" data-val-length="Введено слишком много символов. Допустимо: 8191" data-val-length-max="8191" data-val-required="Требуется поле Текст записи." id="Description" name="Description" rows="2"></textarea>

(\&lt;(/?[^\&gt;]+)\&gt;) 不起作用,因为它只匹配 html 标签。我需要一个匹配所有不是 HTML 标记的内容的正则表达式。换句话说,否定整个正则表达式。

这是一个工作示例http://cafuego.net/2011/11/15/html-and-regular-expressions。但我想(?&lt;=^|&gt;)([^&gt;&lt;]+?)(?=&lt;|$) 它只适用于 php。

【问题讨论】:

  • 您到底想允许和阻止什么?
  • 那么究竟什么形式必须是文本框的形式或内容呢?除了 HTML 标签之外的任何东西?这听起来应该只是 HTML 转义。
  • 我想阻止 html 标签。 text text - 有效。 text text &lt;b&gt; text &lt;/b&gt; - 无效并警告用户他输入了无效符号
  • 你不能只是 HTML 转义输入吗?如果它们会被转义,我看不出有任何理由禁止使用 html 标签。

标签: asp.net-mvc regex regex-negation data-annotations


【解决方案1】:

基于您的一个 cmets,您应该能够使用前瞻断言来搜索任何标签;如果找到,则断言将失败,并应显示错误消息。

例如

[RegularExpression(@"^(?![^<]*<[^>]+>).*$", ...

【讨论】:

  • 是的,但您只保存了两次击键(不包括添加的不必要的捕获括号),并且您引入了不必要的回溯 - 并不是很明显。
  • 另外,我还没有测试过,但我认为你甚至可能不需要.*$——单独的断言(连同^)就足够了。
猜你喜欢
  • 2017-05-22
  • 2012-10-26
  • 1970-01-01
  • 2011-04-13
  • 2011-10-29
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多