代码之家  ›  专栏  ›  技术社区  ›  berkes

验证的格式以排除某些模式

  •  1
  • berkes  · 技术社区  · 15 年前

    我希望Rails模型排除某些模式:两个或更多空间的运行。

    User.name = "Harry Junior Potter" 是有效的,但 User.name = "Harry Junior Potter" 不是(哈里和朱尼尔之间有两个空格)。 这是为了避免身份盗窃,因为这两个名称显示相同(HTML压缩了一段空白)。

    换句话说:允许是: [0-9A-z_-] \s 仅在一系列中。

    我的正则表达式太差,无法构造这样的regexp,这就是我所拥有的(带有负的 lookahead ,但它不匹配。

     /([0-9A-z_\-])(\s(?!\s))?/
    

    注意:一个before-validation hook已经除去了()s的所有元素,所以字符串开头或结尾的空格不是问题。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Alan Moore Chris Ballance    15 年前

    首先, [A-z] 是一个错误。相当于

    [A-Z\[\\\]^_`a-z]
    

    …我很确定这不是你想的。您必须分别列出这两个范围: [A-Za-z] . 但是在这种情况下,您还需要匹配数字和下划线,因此您可以使用 \w 就像@sjuul一样: [\w-]+ . 那就是你的瑞格鞋

    /^[\w-]+(?: [\w-])*$/
    

    当然,这会符合像 -- - --- 和它 不会 匹配很多真名。我只是回答你关于名字之间只允许有一个空格的问题。

        2
  •  1
  •   Sjuul Janssen    15 年前

    换一个不是很容易吗 "__" with "_" ?(使用下划线显示空格) 我的红宝石不太流利,但应该是

    User.name.replace!("  ", " ") while User.name.contains("  ")
    

    然后你可以用这个regex来检查剩下的

    ([\w\-]+\s?)+
    
        3
  •  0
  •   Shripad Krishna    15 年前

    我建议换一条路线……事实上是一个非常奇怪的。如果您正处于时间紧迫的情况下,不需要在现有表中增加一列,那么我建议您创建一个用户名段。我知道你的问题太过分了。但我更喜欢用这种方式开支票。我没有对照已经存储的用户名检查新的用户名(并打破我对所有这些乱七八糟的regex的认识),而是对照存储的slug检查新的slug(顺便说一下,它为您处理所有这些乱七八糟的regex)。你可以退房 托斯隆 : http://github.com/ludo/to_slug

    slug主要用于过滤URL中的危险字符。为什么不使用相同的方法来检查用户名呢?它也处理Unicode字符。

    这不是你问题的直接答案。但我和你面对的情况是一样的,因为时间紧迫,我决定用鼻涕虫。

    控制台中的一个简单签入将产生:

    >> "Harry Junior Potter".to_slug
    => "harry-junior-potter"
    >> "Harry  Junior  Potter".to_slug
    => "harry-junior-potter"
    >> "Harry         Junior           Potter".to_slug
    => "harry-junior-potter"
    >> "Harry(junior(potter))".to_slug
    => "harry-junior-potter"
    >> "Harry_Junior_Potter".to_slug
    => "harry_junior_potter"
    

    所以,现在,如果并且只有当slug验证用户被允许存储他的名字时。