我想要一个rails模型来排除某些模式:两个或更多空格的运行。
User.name = "Harry Junior Potter"
有效,但User.name = "Harry Junior Potter"
不是(Harry和Junior之间有两个空格)。
这是为了避免身份盗用,这两个名称显示相同(HTML压缩空格的运行)。
换句话说:允许的是:[0-9A-z_-]
和“\s
仅限一系列”。
我的正则表达式太差,无法制作这样的正则表达式,这就是我所拥有的(带有lookahead的负数,但它与正确的匹配。
/([0-9A-z_\-])(\s(?!\s))?/
注意:before_validation挂钩已经strip()s所有元素,因此字符串开头或结尾的空格不是问题。
答案 0 :(得分:1)
替换"__" with "_"
是不是更容易? (使用下划线显示空格)
我的Ruby不是那么流利但它应该像
User.name.replace!(" ", " ") while User.name.contains(" ")
然后你可以使用这个正则表达式来检查其余的
([\w\-]+\s?)+
答案 1 :(得分:1)
首先,[A-z]
是一个错误。它相当于
[A-Z\[\\\]^_`a-z]
......而且我很确定这不是你的想法。您必须单独拼出两个范围:[A-Za-z]
。但在这种情况下,您还匹配数字和下划线,因此您可以使用\w
,例如@Sjuul:[\w-]+
。这使你的正则表达式
/^[\w-]+(?: [\w-])*$/
当然,这会与-- - ---
之类的愚蠢内容相匹配, 我只是回答你关于在名字之间只允许一个空格的问题。
答案 2 :(得分:0)
我会建议另一条路线......实际上是一个非常奇怪的路线。如果您正处于紧张状态并且不打算在现有表中添加额外的列,那么我建议创建一个用户名的slug。我知道你的问题太过分了。但我更喜欢这样做我的支票。而不是检查已经存储的新用户名(并打破我所有那些凌乱的正则表达式),我只是检查存储的slug的新slug(顺便说一下,为你处理所有那些凌乱的正则表达式)。您可以查看 to_slug :http://github.com/ludo/to_slug
Slugs主要用于过滤掉URL中的危险字符。为什么不使用相同的方法来检查用户名?它也处理unicode字符。
这不是您问题的直接答案。但是我遇到了和你一样的情况,因为我正处于紧张状态,所以我决定使用slu ..
我的控制台中的简单检查产生:
>> "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验证时,允许用户存储他的名字。