【问题标题】:Regex for tags separated by spaces/commas, up to n tags由空格/逗号分隔的标签的正则表达式,最多 n 个标签
【发布时间】:2026-02-03 12:25:01
【问题描述】:

我想通过在 Codeigniter 的验证库中运行正则表达式来验证用户输入的帖子索引标签。

理想情况下,正则表达式应具有以下条件:

  1. 只允许字母和数字
  2. 如果用空格(任何数字)或逗号(任何数字)分隔,标签将被视为唯一实体
  3. 标签的数量应该有限制(例如本例中为 6 个)

在 SO 上有一些部分解决方案:

但他们并没有完全解决我的问题。

有什么建议吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    如果你想要的只是验证,那么应该这样做:

    ^[a-zA-Z0-9]+(?:[ ,]+[a-zA-Z0-9]+){0,5}$
    

    相同的正则表达式,但带有 cmets 和空格:

    ^ #beginning of string
    [a-zA-Z0-9]+ #any sequence of alphanumeric letters
    (?: #start of non capturing group
        [\ ,]+ #between 1 and int delimiting chars
        [a-zA-Z0-9]+ #again, any sequence of alphanumeric letters
    ) #end of non capturing group
    {0,5} #allow between 0 and n-1 occurrences of preceding group
    $ #end of string
    

    要允许输入带有前导/尾随空格/逗号,请将正则表达式更改为:

    ^[ ,]*[a-zA-Z0-9]+(?:[ ,]+[a-zA-Z0-9]+){0,5}[ ,]*$
    

    为了进一步允许零标签输入,将正则表达式更改为:

    ^[ ,]*(?:[a-zA-Z0-9]+(?:[ ,]+[a-zA-Z0-9]+){0,5})?[ ,]*$
    

    【讨论】:

    • 谢谢 - 如果我需要更改允许标签的数量(例如最多 n=10),我将如何更改 {1,5}
    • 规则是:{0,n-1}(注意零!{1,5} 错了。抱歉)。给我一秒钟,我会用一些 cmets 来更新答案,解释正则表达式的作用。
    • 谢谢 - 只是注意到如果我只输入一个标签,它会返回 false
    • @torr:是的,我自己也注意到了。当然应该是{0,n-1}。顺便说一句,正则表达式是否需要至少存在一个标签,或者还允许空输入?那么前导/尾随空格/逗号呢?
    • 太棒了 - 最后一件事 - 如果我输入任意数量的标签并留下尾随空格或逗号,规则将计算一个不存在的附加元素 - 这很容易解决吗?
    【解决方案2】:

    这是 PCRE 正则表达式:

    ^\w+[,\s]\w+\[,s]\w+[,\s]\w+[,\s]\w+[,\s]\w+$
    

    【讨论】:

    • 这不符合@torr 给出的任何要求。
    • 这个答案有很多错误,甚至不再有趣了。错误地转义[,缺少\s 的转义,只是从拼写错误开始。下一个:\s 不仅匹配space\w 匹配_,这是不允许的,因此违反了要求#1。仅匹配由单个空格/逗号分隔的标签,因此违反了要求 #2。仅当恰好提供 6 个标签时才匹配,因此违反了要求 #3。总违规/错误:6(如果不是更多),正确的事情:0。