【问题标题】:rails validation regular expression for www and httpwww 和 http 的 rails 验证正则表达式
【发布时间】:2013-07-31 09:51:20
【问题描述】:

我想验证表单输入,以便不允许使用 http:// 和 www。哪个正则表达式可以工作?

例如:

允许

google.com

不允许

型号

VALID_DOMAIN_REGEX = ???

验证 :domain, format: { with: VALID_DOMAIN_REGEX }

【问题讨论】:

    标签: ruby-on-rails ruby regex validation


    【解决方案1】:

    由于http:// 包含如此多的正斜杠,这将是 Ruby 的 %r{} 正则表达式文字语法的一个很好的用途。

    def has_forbidden_prefix?(string)
      string =~ %r{^(http://|www)}
    end
    

    如果字符串不是以 http://www 开头,这将返回 nil,falsy。

    如果字符串返回 0,truthy(第一个匹配的偏移量)。

    您可以使用validate :some_method_name在模型中调用自定义验证方法,我将其结构如下

    model MyThing
      validate :no_forbidden_prefix
    
      private
    
      def has_forbidden_prefix?(string)
        string =~ %r{^(http://|www)}
      end
    
      def no_forbidden_prefix
        if has_forbidden_prefix?(uri)
          errors.add :domain, 'The URI cannot start with "http://" or "www"'
        end
      end
    end
    

    【讨论】:

    • 谢谢,我编辑了我的问题。如何在我的模型中包含您的解决方案?
    • 我已经扩展了我的解决方案以提供示例实现,我发现使用私有方法的自定义验证更具可读性,但这只是我的观点。 :)
    • 未定义的局部变量或方法`uri'
    • 我不是说你应该逐字复制它;)你想提供你在这里验证的域字段。
    • 对不起,我有点困惑。那么我怎样才能最终验证 :domain 列呢?像验证:域,:no_forbidden_​​prefix之类的东西?还是在控制器中?
    【解决方案2】:

    这应该为你做:

    /^[http\:\/\/|www].*/
    

    例如:

    1.9.2p320 :007 > "http://www.google.de".match /^[http\:\/\/|www].*/
     => #<MatchData "http://www.google.de">
    1.9.2p320 :008 > "www.google.de".match /^[http\:\/\/|www].*/
     => #<MatchData "www.google.de">
    1.9.2p320 :009 > "google.de".match /^[http\:\/\/|www].*/
     => nil
    

    因此,如果它对您的目的有效,则它不匹配...

    【讨论】:

    • [http\:\/\/|www] 是一个字符类,也许你打算使用分组?
    • 谢谢,但是当我这样做时它不起作用:“www.google.com”.sub(/^[http\:\/\/|www]./, " ") => "w.google.com"
    • @toro2k 是的,我需要使用分组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2010-10-06
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多