Проверка правильности URL в Ruby - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий код рубина в модели:

if privacy_policy_link.match(/#{domain}($|\/$)/) errors.add(:privacy_policy_link, 'Link to a specific privacy policy page on your site instead of your homepage.') end

Это работало до тех пор, пока пользователь не попытался сохранить ссылку на политику конфиденциальности, которая выглядела так:

https://example.com/about-me/privacy-policy-for-example-com/

Цель состоит в том, чтобы я не хотел, чтобы они ссылались на свою базовую домашнюю страницу (example.com или www.example.com и т. Д.) По этой ссылке на политику конфиденциальности (по некоторым случайным и сложным причинам, которые яне буду вдаваться).Ссылка, указанная выше , должна пройти сопоставление (это означает, что, поскольку они ссылаются на отдельную страницу на своем сайте, она не должна рассматриваться как совпадение, и они не должны видеть никаких ошибок при сохранении формы)- но поскольку они ссылаются на свой базовый домен во второй половине URL-адреса, это выглядит как совпадение.

Я не могу при всей своей жизни понять, как правильное регулярное выражение в Rubular позволяет этому URL-адресу пройти алгоритм сопоставления.И, конечно, я не могу просто попросить пользователя переименовать ссылку на свою политику конфиденциальности, чтобы в конце удалить из него «com» ​​- потому что это: https://example.com/about-me/privacy-policy-for-example пройдет.:)

Буду очень признателен за любую помощь, которая поможет мне понять, как решить эту проблему!

Рубулярная ссылка: http://rubular.com/r/G5OmYfzi6t

1 Ответ

0 голосов
/ 18 декабря 2018

Ваша проблема в том, что символ . - это любой символ, поэтому он соответствует - в example-com.

Если вы соедините его в начало строки, он будет совпадать правильно, не пытаясь убежать. в домене.

if privacy_policy_link.match(%r{^(http[s]?://|)(www.)?#{domain}($|/$)})
...