【问题标题】:Regex that does not match any html tag不匹配任何 html 标签的正则表达式
【发布时间】:2015-03-31 16:04:11
【问题描述】:

我对正则表达式真的很不好,我想要的是一个不匹配任何 html 标签的正则表达式(用于用户输入验证)。

我想要的是否定的:

<[^>]+>

我现在拥有的是

public class MessageViewModel
{
    [Required]
    [RegularExpression(@"<[^>]+>", ErrorMessage = "No html tags allowed")]
    public string UserName { get; set; }
}

但它与我想要的相反 - 只允许带有 html 标签的用户名

【问题讨论】:

    标签: c# regex asp.net-mvc unobtrusive-validation


    【解决方案1】:

    正则表达式不能进行“否定”匹配。

    但他们可以进行“肯定”匹配,然后您可以将他们找到的所有内容都从字符串中丢弃。


    编辑 - 问题更新后,事情变得更清楚了。试试这个:

    public class MessageViewModel
    {
        [Required]
        [RegularExpression(@"^(?!.*<[^>]+>).*", ErrorMessage = "No html tags allowed")]
        public string UserName { get; set; }
    }
    

    解释:

    ^            # start of string
    (?!          # negative look-ahead (a position not followed by...)
      .*         #   anything
      <[^>]+>    #   something that looks like an HTML tag
    )            # end look-ahead
    .*           # match the remainder of the string
    

    【讨论】:

    • 我在 c# 中使用 [RegularExpression] 属性,我想禁止用户输入任何 html 标签
    • 正是我想要的,但找不到明确的语法。正则表达式是迄今为止我遇到的最复杂的事情
    • 不要将事物列入黑名单(如 HTML 标签),而应考虑将其列入白名单。这更安全,更容易维护。 [RegularExpression(@"^[\p{L}\p{N}]+$", ErrorMessage = "Only letters and numbers. No spaces allowed.")] 请参阅 regular-expressions.info/unicode.html 以获取选择正确 Unicode 字符范围的帮助。此"^[a-zA-Z0-9]+$" 的非Unicode 版本。
    • 它似乎可以与内联 s 修饰符一起使用。 ^(?s)(?!.*&lt;[^&gt;]+&gt;).*
    • @Wesley 当然,这是另一种选择。 .NET 正则表达式风格支持该修饰符,但并非全部都支持。
    【解决方案2】:

    这个问题有点老了,但我最近几乎遇到了同样的需求。

    如果在阻止 HTML 看到它有标签之前/之后有空格,我想允许 ">" 或 "

    也许它并不完美,但它为我完成了工作:

    ^((?!(<\S)|(\S>)).)*$
    

    你可以在这里测试它:regex101.com

    【讨论】:

    • 鉴于已经有一个公认的答案(很久以前),您能否解释一下在哪种情况下您的解决方案将是一个有趣的替代方案,以帮助用户做出选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多