【问题标题】:Regex for website or url validation [duplicate]用于网站或 url 验证的正则表达式 [重复]
【发布时间】:2017-07-25 22:10:55
【问题描述】:

我知道这是一个很常见的问题,对此有很多答案,但我的问题不同,我想接受以下所有格式的 URL:

http://www.sample.com
https://www.sample.com
http://www.sample.com/xyz
www.sample.com
www.sample.com/xyz/#/xyz
sample.com

// & much more ...

所以这里的想法是,我允许用户进入那里的网站,另一个用户只需点击保存的网站并转到用户网站。所以在这里限制用户输入正确的 URL 不是一个好主意,他们可以输入上述任何格式。这是我现在使用的正则表达式,但它只检查 URL 是否从正确的协议开始:

^(ftp|http|https):\/\/[^ "]+$

【问题讨论】:

  • 你要验证协议还是域地址?,如果是协议,检查默认浏览器协议,如果没有指定,相应地进行验证。
  • 实际上,用户可以使用协议或仅域输入,但不能像任何随机字符串一样输入,它应该符合我输入的那些给定标准
  • 所以如果协议正确,如果 url 包含“sample.com”它应该通过,这就是你的意思吗?
  • @Rizwan,是的,这是处理上述验证的最佳和最简单的方法之一。
  • @RizwanM.Tuman 也可能没有协议,所以如果没有协议也应该通过我自己处理,为什么要求用户输入它,有些用户甚至不知道 HTTP 或 HTTPS

标签: javascript regex validation


【解决方案1】:

使用正则表达式^((https?|ftp|smtp):\/\/)?(www.)?[a-z0-9]+\.[a-z]+(\/[a-zA-Z0-9#]+\/?)*$

这是我刚刚构建的一个基本的。谷歌搜索可以为您提供更多信息。

这里

  • ^ 应该以
  • 开头
  • ((https?|ftp|smtp)://)?可能包含也可能不包含这些协议中的任何一个
  • (万维网)?可能有也可能没有 www。
  • [a-z0-9]+(.[a-z]+) url 和域以及子域(如果有最多 2 个级别)
  • (/[a-zA-Z0-9#]+/?)*/?可以包含文件的路径,但不是必需的。最后可能包含/
  • $ 应该到此为止

var a=["http://www.sample.com","https://www.sample.com/","https://www.sample.com#","http://www.sample.com/xyz","http://www.sample.com/#xyz","www.sample.com","www.sample.com/xyz/#/xyz","sample.com","sample.com?name=foo","http://www.sample.com#xyz","http://www.sample.c"];
var re=/^((https?|ftp|smtp):\/\/)?(www.)?[a-z0-9]+(\.[a-z]{2,}){1,3}(#?\/?[a-zA-Z0-9#]+)*\/?(\?[a-zA-Z0-9-_]+=[a-zA-Z0-9-%]+&?)?$/;
a.map(x=>console.log(x+" => "+re.test(x)));

【讨论】:

  • 如果我最后输入这样的http://www.sample.com/ / 它也不适用于查询字符串
  • 增加了对sample.com#的支持
  • 这个不支持。 www.google.co.in
  • 嗨,为了支持像https://code.tutsplus.com/tutorials/8-regular-expressions-you-should-know--net-6149 这样的URL,我认为你应该将(#?\/?[a-zA-Z0-9#]+) 更改为(#?\/?[a-zA-Z0-9-_#]+)
  • 这不支持像“web-site.com”或“web-site.com”这样的URL
【解决方案2】:

你可以试试这个:

^((ftp|http|https):\/\/)?(www.)?(?!.*(ftp|http|https|www.))[a-zA-Z0-9_-]+(\.[a-zA-Z]+)+((\/)[\w#]+)*(\/\w+\?[a-zA-Z0-9_]+=\w+(&[a-zA-Z0-9_]+=\w+)*)?$

Updated Demo

const regex = /^((ftp|http|https):\/\/)?(www.)?(?!.*(ftp|http|https|www.))[a-zA-Z0-9_-]+(\.[a-zA-Z]+)+((\/)[\w#]+)*(\/\w+\?[a-zA-Z0-9_]+=\w+(&[a-zA-Z0-9_]+=\w+)*)?$/gm;
const str = `http://www.sample.com
https://www.sample.com
http://www.sample.com/xyz
www.sample.com
www.sample.com/xyz/#/xyz
sample.com
www.sample.com
mofiz.com
kolim.com
www.murikhao.www.sample.com
http://murihao.www.sample.com
http://www.sample.com/xyz?abc=dkd&p=q&c=2
www.sample.gov.bd
www.sample.com.en
www.sample.vu


`;
let m;

while ((m = regex.exec(str)) !== null) {

    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    console.log("matched :"+m[0]);
}

【讨论】:

  • 这不支持 子域 (我应该将其添加到我的列表中) 它还应该支持其他顶级域.tv, .in, .co.in all这是有效的
  • 是的,你应该有 :) 我的答案的基础是有 sample.com,帮我定义基础,有你喜欢的答案
  • 是的,它可以是任何东西,它可以包含任何顶级域、任何域名(不仅是示例)、协议、查询字符串和哈希
  • :D :D 我以为你一开始只是在谈论 sample.com,请现在看看 :P
  • @DheerajAgrawal 现在解决你的问题了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2014-09-15
  • 2013-05-02
  • 2011-05-11
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多