用于网站或URL验证的正则表达式

28

我知道这是一个常见问题,有很多答案,但我的问题不同,我想接受所有以下格式的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):\/\/[^ "]+$

实际上,用户可以输入协议或仅输入域名,但不能随意输入任何字符串,它应该符合我在问题中输入的那些标准。 - Dheeraj Agrawal
1
所以根据适当的协议,如果URL包含“sample.com”,它应该通过,这是你的意思吗? - Mustofa Rizwan
@RizwanM.Tuman 还有可能没有协议,如果没有协议也应该通过,如果没有协议,我会自己处理,为什么要让用户输入呢,有些用户甚至不知道HTTP或HTTPS。 - Dheeraj Agrawal
你的问题与其他问题有何不同? - user663031
@torazaburo 大多数情况下,我找到的是关于 URL 验证的答案,如果是针对域名的,则不包含 hashquery strings - Dheeraj Agrawal
显示剩余5条评论
2个回答

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

这是我刚刚创建的基本正则表达式。可以通过谷歌搜索获得更多信息。

这里:

  • ^表示开头
  • ((https?|ftp|smtp)://)? 可以包含任意数量的这些协议
  • (www\.)? 可以有或没有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/ /,最后它不起作用,也适用于查询字符串。 - Dheeraj Agrawal
2
增加了对 http://www.sample.com# 的支持。 - Sagar V
2
抱歉,此内容不支持。www.google.co.in - Talk is Cheap Show me Code
3
你好,为了支持像https://code.tutsplus.com/tutorials/8-regular-expressions-you-should-know--net-6149这样的链接,我认为你应该将(#?\/?[a-zA-Z0-9#]+)改为(#?\/?[a-zA-Z0-9-_#]+) - Malinda
2
此功能不支持类似于“https://web-site.com”或“https://www.web-site.com”的URL。 - smartmouse
显示剩余11条评论

14

你可以尝试这个:

^((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+)*)?\/?$

更新演示

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
www.sample.u/


`;
let m;

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

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


这不支持子域名(我应该把它加入我的列表中),同时它应该支持其他顶级域名.tv,.in,.co.in,所有这些都是有效的。 - Dheeraj Agrawal
是的,你应该有的 :) 我回答的基础是要有sample.com,帮我定义这个基础,以便得到你喜欢的答案。 - Mustofa Rizwan
是的,它可以是任何东西,可以包含任何顶级域、任何域名(不仅仅是示例)、协议、查询字符串和哈希。 - Dheeraj Agrawal
1
哈哈,我以为你一开始只是在谈论sample.com,现在请看一下吧。 :P - Mustofa Rizwan
@DheerajAgrawal,这个问题现在解决了吗? - Mustofa Rizwan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接