Regex for website or url validation
本问题已经有最佳答案,请猛点这里访问。
我知道这是一个很常见的问题,有这么多答案,但我的问题不同,我想接受以下所有格式的URL:
1 2 3 4 5 6 7 8 | 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不是一个好主意,他们可以输入上述任何格式。这是我现在使用的regex,但这只检查URL是否从正确的协议开始:
1 | ^(ftp|http|https):\/\/[^"]+$ |
使用regex
这是我刚才做的一个基本的。谷歌搜索可以给你更多。
在这里
- ^应该从
- ((http)?| ftp smtp):/)?可能包含也可能不包含这些协议
- (www.)?可能有也可能没有www.
- [A-Z0-9]+([A-Z]+)URL和域,以及子域(如果有),最多2级
- (/[A-ZA-Z0-9]+/?)*/?可以包含文件的路径,但不是必需的。最后一个可能包含EDOCX1[1]
- $应该在那里结束
1 2 3 | 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))); |
您可以尝试以下操作:
1 | ^((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+)*)?$ |
更新演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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]); } |