Url validation rails
在我的模型中,我添加了以下代码来验证用户可以输入的URL:
1 2
| validates :website, presence: true
validates :website, format: { with: URI.regexp }, if: 'website.present?' |
我用无效的URL编写了一个测试:
运行测试时,验证表明这是有效输入。我已经在程序本身中尝试过它,这是一个可接受的URI。有没有办法设置URI.regex,所以这是一个无效的URL?
URI.regexp返回一个将与所有有效URI匹配的URI,但是a)它不验证字符串只是该URI,并且b)您要验证URL,而不是URI(更广泛的术语是URI) 。
对于a),可以将正则表达式修改为仅在字符串只是URI时才匹配,方法是将其package在^(行首)和$(行尾)符号中:
1
| validates :website, format: { with: /^#{URI.regexp.to_s}$/ }, if: 'website.present?' |
对于b),您可以将调用更改为URI.regexp(['http', 'https']),以限制允许的方案,这使您更加接近。也有一些针对此问题的工具,例如valid_url。或者,仅接受您的验证永远不会是完美的。
- 谢谢罗伯特,我添加了以下有效的正则表达式:/ \\\\\\\\ A(?:( ?: https?| http):\\\\\\\\ / \\\\\\\\\\ /)(?:\\\\\\\\ S( ?:: \\\\\\\\ S *)?@)?(?:( ?! 10(?:\\\\\\\\。\\\\\\\\ d ?? {1,3}){3})(?! 127 (?:\\\\\\\\ ??。\\\\\\\\ d {1,3}){3})(?! 169 \\\\\\\\ ????。254(?:\\\\\\\\。\\\\\\\\ d {1,3}){2} ??)(?! 192 \\\\\\\\。168(?:\\\\\\\\。\\\\\\\\ d {?? 1,3}){2})(?! 172 \\\\\\\\。(?:?? 1 [6-9] | 2 \\\\\\\\ d | 3 [0-1])(???:\\\\\\\\。\\\\\\\\ d {1, 3}} {2})(?:[1 ??-9] \\\\\\\\ d?| 1 \\\\\\\\ d \\\\\\\\ d | 2 [01] \\\\\\\\ d ?? | 22 [ 0-3])(?:\\\\\\\\。(?: 1?\\\\\\\\ ?? d {1,2} | 2 [0-4] \\\\\\\\ d | 25 [0 ??-5 ])){2}(?:\\\\\\\\。(?:[1-9 ??] \\\\\\\\ d?| 1 \\\\\\\\ d \\\\\\\\ d | 2 [0-4] \\ \\\\\\ d | ?? 25 [0-4]))|(?:(?:[az ?? \\\\\\ u00a1-\\\\\\\\ uffff0-9]-???)* [az \\\\ \\\\ u00a1-\\\\\\\\ uffff0 ??-9])(?:\\\\\\\\。(?:[az \\\\\\\\ u0 ?? 0a1-\\\\\\\\ uffff0-9]-?)* [ ?? az \\\\\\\\ u00a1-\\\\\\\\ uffff0-9] ??)*(?:\\\\\\\\。(?:[az \\\\\\\\ u00a ?? 1-\\\\\\\\ uffff] { 2,})))((?:: ?? \\\\\\\\ d {2,5})?(?:\\\\\\\\ / [^ \\\\\\\\ s] * ??)?\\\\\\\\ z /一世