如何从凌乱的用户输入中匹配/提取域名?

时间:2009-09-19 02:52:56

标签: ruby-on-rails ruby regex

有一个表单字段,用户以“google.com”的形式输入域名。

然而,考虑到困惑的用户,我希望能够在输入“google.com”的确切形式时将其清除,以防他们输入以下情况:

http://www.google.com
http://google.com
google.com/blah
www.google.com
..and other incorrect forms

实现这一目标的最佳方法是什么?

提前致谢!

3 个答案:

答案 0 :(得分:6)

你应该在addressable/uri上构建你的系统,这个gem会处理URI的东西(路径,主机,端口),你只需要提供http的默认方案。

gem install addressable)。

示例

>> uri = Addressable::URI.parse("http://google.com?q=lolcat")
=> #<Addressable::URI:0x80bcf0e0 URI:http://google.com?q=lolcat>
>> [uri.host,uri.path,uri.scheme]
=> ["google.com", "", "http"]

基本上你只需要检测http://是否存在并添加它(如果不是这种情况),因为URI不会为你猜测它。它完成了,没有更多的手动处理。

答案 1 :(得分:4)

您可以使用正则表达式编写简单的函数来清除它们:

  def foo(s)
    s.gsub(/^(http:\/\/)?(www\.)?/,'').gsub(/\/.*$/,'')
  end

这适用于您提供的所有示例。如果这还不够,请添加更多测试用例:

  def test_foo
    assert_equal 'google.com', foo('http://www.google.com')
    assert_equal 'google.com', foo('http://google.com')
    assert_equal 'google.com', foo('google.com/blah')
    assert_equal 'google.com', foo('www.google.com')
  end

答案 2 :(得分:0)

这很难。您不仅需要解析许多不同形式的URI,而且还需要知道如何使用诸如Public Suffix List之类的内容从主机名获取TLD,就像Firefox一样。