【问题标题】:Ruby regex for domain validation用于域验证的 Ruby 正则表达式
【发布时间】:2011-09-07 09:58:18
【问题描述】:

我正在寻找一个正则表达式来验证我的用户选择的域,即 I.E. http://mysite.com/userdomain

我只关心它是否允许正确的字符。

【问题讨论】:

  • 您的术语有点混乱。您在谈论域,即 mysite.com 部分;但是您还将 userdomain 写为第一级文件夹 - 这似乎表明您可能正在谈论有效的 url 文件夹名称。它是哪一个?您是否需要单独验证“mysite.com”、“mysite.com/userdomain”或“userdomain”?
  • 为了让这项检查在现实世界中发挥作用,您最终会想知道域是否真的存在。虽然查看域在语法上是否正确相对容易,但这并不能告诉您真正需要知道的内容,即它是否可用和有效。而且,您最好的办法是实际 ping 它或尝试连接,而且,要做到这一点,您可能需要尊重实际的方案,例如 ftp 或 http。所以,到那时,像@Bert Goethals 建议的那样,只使用 URI 或 Addressable::URI 可能更有意义。我自己更喜欢 Addressable::URI。
  • 这里说的是文件夹名

标签: ruby regex validation


【解决方案1】:

嗯,一个正则表达式可以帮助你很长的路要走,但你可能想考虑只解析 URL。

def validate_url(url)
  uri = URI.parse(url)
  uri.class != URI::HTTP
rescue URI::InvalidURIError
  false
end

可以使用替代寻址::URI 代替 URI(@abe-voelker 建议)

(来源:http://actsasblog.wordpress.com/2006/10/16/url-validation-in-rubyrails/

【讨论】:

  • 谢谢,但实际上我需要验证的不是完整的 url,只是用户选择的域
  • 如果走这条路,我可以建议改用 Addressable::URI,因为它对 RFC 规范和国际化有更好的支持。
  • +1 用于使用已建立的库进行解析,而且...哦,我不能再次 +1 建议 Addressable::URI。
【解决方案2】:

只需前往Regex Lib 并选择一个您喜欢的(该链接已经指向您正在寻找的正则表达式类型的搜索)。

【讨论】:

    【解决方案3】:

    您是否试图弄清楚用户是否给您一个有效的名称作为 url 中的文件夹? (CGI.escape(some_folder_name) != some_folder_name 可能会把你带到你需要的地方。)


    或者您在寻找Regexp.new(Regexp.escape(some_url_string))

    这会生成一个匹配任何some_url_string 实例的正则表达式。

    这样使用:

    user.domain = "http://mysite.com/userdomain" # or "mysite.com/userdomain"
    incoming_domain = "http://mysite.com/userdomain/a_post"
    users_domain_regexp = Regexp.new(Regexp.escape(user.domain))
    if incoming_domain =~ users_domain_regexp
       puts "By George, we've done it!"
    else
       puts "I'm sorry, but we're prejudiced against that url"
    end
    #=> "By George, we've done it!"
    

    【讨论】:

    • 为什么要使用正则匹配?子字符串匹配同样有用且麻烦更少。 !!incoming_domain[user.domain] 将给出真/假。
    • 我很确定他实际上是在谈论文件夹“userdomain”,而不是实际的域名;并且他想确保用户为该文件夹选择的名称不会中断 url。
    • 这正是我要问的
    【解决方案4】:

    您可以使用Rubular 来测试您的正则表达式。

    【讨论】:

      最近更新 更多