validates_format_of以排除某些模式

时间:2010-07-17 10:31:27

标签: ruby-on-rails regex validation

我想要一个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所有元素,因此字符串开头或结尾的空格不是问题。

3 个答案:

答案 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验证时,允许用户存储他的名字。