2

我需要进行模型验证来阻止个人电子邮件帐户。

我有以下内容:

PERSONAL_DOMAINS = %w[
 yahoo.
 ymail
 verizon
]

正则表达式验证:

:format => {
  :without => /#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')}/
}

雅虎在末尾有一个点的原因是允许 yahoo-inc.com 但阻止所有个人域,如 yahoo.com、yahoo.fr、yahoo.uk 等......

这个正则表达式失败并导致 yahoo-inc.com 被拒绝......关于如何更新它以使上述用例通过的任何建议?谢谢

4

2 回答 2

2

尝试在没有 Rails 的情况下进行匹配,以帮助缩小正在发生的事情:

PERSONAL_DOMAINS_REGEXP = /#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')}/
=> /yahoo\.|ymail|verizon/

"yahoo-inc.com".match(PERSONAL_DOMAINS_REGEXP)
=> nil

"yahoo.com".match(PERSONAL_DOMAINS_REGEXP)
=> #<MatchData "yahoo.">
于 2012-04-04T01:37:42.267 回答
0

尝试以下正则表达式:

/(^|\.)(#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')})\.[^.]+$/i

这将匹配其第二个组件恰好是列表之一的所有域。

所以它会匹配:

yahoo.com
Yahoo.fr
sub.yahoo.id

等等,但不是

yahoo-inc.com
notyahoo.com
yahoo.other.com

(将“雅虎”改回“雅虎”)

还要注意末尾的“/i”。域不区分大小写,因此您将需要它。

于 2012-04-04T10:43:52.407 回答