Как сопоставить / извлечь доменное имя из грязного ввода пользователя? - PullRequest
1 голос
/ 19 сентября 2009

Существует поле формы, где пользователи должны ввести доменные имена в виде "google.com".

Однако, учитывая запутанные пользователи, я хочу иметь возможность очистить ввод в точную форму "google.com" в случае, если они вводят в следующих случаях:

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

Каков наилучший способ сделать это?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 19 сентября 2009

Вы должны построить свою систему через адресуемый / uri , этот гем будет заботиться о 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 не угадал бы его для вас. И это сделано, больше ничего не нужно обрабатывать вручную.

4 голосов
/ 19 сентября 2009

Вы можете написать простую функцию, которая очищает их с помощью регулярных выражений:

  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
0 голосов
/ 19 сентября 2009

Это сложно. Вам нужно будет не только проанализировать множество различных форм URI, но и узнать, как получить TLD от имени хоста, используя что-то вроде Public Suffix List , как это делает Firefox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...