Мне было интересно, как лучше всего проверять URL-адреса в Rails. Я думал об использовании регулярного выражения, но не уверен, что это лучший способ.
И, если бы я использовал регулярное выражение, мог бы кто-нибудь предложить мне его? Я все еще новичок в Regex.
ruby-on-rails
ruby
regex
validation
url
сойка
источник
источник
Ответы:
Проверка URL - непростая задача. Это тоже очень широкий запрос.
Что именно вы хотите делать? Вы хотите проверить формат URL, наличие или что-то еще? Есть несколько возможностей, в зависимости от того, что вы хотите сделать.
Регулярное выражение может проверять формат URL-адреса. Но даже сложное регулярное выражение не может гарантировать, что вы имеете дело с действительным URL.
Например, если вы возьмете простое регулярное выражение, оно, вероятно, отклонит следующий хост
но это позволит
это действительный хост, но не действительный домен, если учесть существующие TLD. Действительно, решение будет работать, если вы хотите проверить имя хоста, а не домен, потому что следующее является допустимым именем хоста
а также следующий
Теперь позвольте мне предложить вам несколько решений.
Если вы хотите проверить домен, вам нужно забыть о регулярных выражениях. Лучшее решение, доступное на данный момент, - это список общедоступных суффиксов, который поддерживается Mozilla. Я создал библиотеку Ruby для анализа и проверки доменов на соответствие списку публичных суффиксов, и она называется PublicSuffix. .
Если вы хотите проверить формат URI / URL-адреса, вы можете использовать регулярные выражения. Вместо поиска используйте встроенный
URI.parse
метод Ruby .Вы даже можете сделать его более строгим. Например, если вы хотите, чтобы URL-адрес был URL-адресом HTTP / HTTPS, вы можете сделать проверку более точной.
Конечно, к этому методу можно применить массу улучшений, включая проверку пути или схемы.
И последнее, но не менее важное: вы также можете упаковать этот код в валидатор:
источник
URI::HTTPS
для https uris (например:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
наследуется отURI:HTTP
, поэтому я используюkind_of?
.URI.parse('http://invalid-host.foo')
возвращает истину, потому что этот URI является допустимым URL. Также обратите внимание, что.foo
теперь это действующий TLD. iana.org/domains/root/db/foo.htmlВнутри моих моделей я использую одинарный лайнер:
validates :url, format: URI::regexp(%w[http https])
Думаю, достаточно хорош и прост в использовании. Более того, теоретически он должен быть эквивалентен методу Симона, поскольку внутри он использует то же регулярное выражение.
источник
'http://'
соответствует приведенному выше шаблону. См .:URI::regexp(%w(http https)) =~ 'http://'
http:fake
будет действительным URL-адрес .Следуя идее Симоны, вы легко можете создать собственный валидатор.
а затем используйте
в вашей модели.
источник
URI("http:").kind_of?(URI::HTTP) #=> true
Также есть гем validate_url (который является просто хорошей оболочкой для
Addressable::URI.parse
решения).Просто добавь
к вашему
Gemfile
, а затем в моделях вы можетеисточник
На этот вопрос уже дан ответ, но, черт возьми, я предлагаю решение, которое использую.
Регулярное выражение отлично работает со всеми URL-адресами, которые я встречал. Метод установки должен позаботиться о том, чтобы протокол не упоминался (предположим, http: //).
И, наконец, мы делаем попытку получить страницу. Возможно, мне следует принимать перенаправления, а не только HTTP 200 OK.
и...
источник
Вы также можете попробовать valid_url гем который разрешает URL-адреса без схемы, проверяет доменную зону и имена IP-хостов.
Добавьте его в свой Gemfile:
gem 'valid_url'
А затем в модели:
источник
Только мои 2 цента:
EDIT: изменено регулярное выражение для соответствия URL-адресам параметров.
источник
http://test.com/fdsfsdf?a=b
Решение, которое сработало для меня, было:
Я попытался использовать некоторые из примеров, которые вы прикрепили, но я поддерживаю URL-адрес следующим образом:
Обратите внимание на использование A и Z, потому что если вы используете ^ и $, вы увидите это предупреждение безопасности от валидаторов Rails.
источник
"https://portal.example.com/portal/#"
. В Ruby 2.1.6 оценка зависает.В последнее время я столкнулся с той же проблемой (мне нужно было проверить URL-адреса в приложении Rails), но мне пришлось справиться с дополнительным требованием URL-адресов Unicode (например,
http://кц.рф
) ...Я исследовал несколько решений и наткнулся на следующее:
URI.parse
. Подробности читайте в ответе Симоне Карлетти. Это работает нормально, но не для URL-адресов Unicode.URI.parse
но с использованиемaddressable
драгоценного камня вместоURI
stdlib. Этот подход подробно описан здесь: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/источник
Addressable::URI.parse('http:///').scheme # => "http"
orAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
- совершенно нормально с точки зрения Addressable :(Вот обновленная версия валидатора, опубликованная Дэвидом Джеймсом . Его опубликовал Бенджамин Флейшер . Тем временем я выпустил обновленную вилку, которую можно найти здесь .
...
Обратите внимание, что все еще существуют странные HTTP-URI, которые анализируются как действительные адреса.
Вот проблема для
addressable
драгоценного камня, который охватывает примеры.источник
Я использую небольшой вариант решения Lafeber, описанного выше . Он запрещает использование следующих друг за другом точек в имени хоста (например, в
www.many...dots.com
):URI.parse
похоже, требует префикса схемы, что в некоторых случаях не то, что вам может понадобиться (например, если вы хотите разрешить своим пользователям быстро писать URL-адреса в таких формах, какtwitter.com/username
)источник
Я использую гем activevalidators, и он работает очень хорошо (не только для проверки URL-адресов)
Вы можете найти это здесь
Все это задокументировано, но в основном после добавления драгоценного камня вы захотите добавить следующие несколько строк в инициализатор, например: /config/environments/initializers/active_validators_activation.rb
(Примечание: вы можете заменить: all на: url или: что угодно, если вы просто хотите проверить определенные типы значений)
А затем вернемся к вашей модели примерно так
Теперь перезапустите сервер, и все должно быть
источник
Если вам нужна простая проверка и пользовательское сообщение об ошибке:
источник
Вы можете проверить несколько URL-адресов, используя что-то вроде:
источник
https://github.com/perfectline/validates_url - красивый и простой драгоценный камень, который почти все сделает за вас
источник
Недавно у меня была такая же проблема, и я нашел способ обойти действительные URL-адреса.
Первой части метода validate_url достаточно для проверки формата URL. Вторая часть будет проверять, существует ли URL-адрес, отправив запрос.
источник
Мне понравился monkeypatch модуль URI, чтобы добавить действительный? метод
внутри
config/initializers/uri.rb
источник
И как модуль
И затем просто
include UrlValidator
в любой модели, для которой вы хотите проверить URL-адрес. Просто в том числе для опций.источник
Проверка URL-адресов не может быть выполнена просто с помощью регулярного выражения, поскольку количество веб-сайтов продолжает расти, а новые схемы именования доменов продолжают появляться.
В моем случае я просто пишу собственный валидатор, который проверяет успешный ответ.
Я проверяю
path
атрибут моей модели, используяrecord.path
. Я также помещаю ошибку в соответствующее имя атрибута, используяrecord.errors[:path]
.Вы можете просто заменить его любым именем атрибута.
Затем я просто вызываю пользовательский валидатор в своей модели.
источник
Вы можете использовать для этого регулярное выражение, для меня это хорошо работает:
источник