我有几个网址
https//abc.domain-name.co
https//*.domain-name.co
*//*.domain-name.co
这里*意味着可以满足所有条件。例如
* //。domains>允许的所有协议
我需要一个正则表达式来提取
要求结果:
for : *//posts.com
"protocol": "*",
"hostname": "posts.com",
for *//*.posts.com
protocol: '*',
hostname: '*.posts.com',
我不能使用URL(js)因为需要有效的Url并且添加*会使url无效,这就是为什么需要正则表达式来将url解析为字符串数组的原因。
据我了解你所问的,这些应该是捕获子域,域和协议的正则表达式:
\/\/([a-z]+)\.
\:\/\/[a-z]+\.(.*)\.
([a-z]+)\:\/\/
因此,如果我们测试以下代码:
var str = "https://abc.domain-name.co";
var patt_subdomain = /\/\/([a-z]+)\./i;
var patt_protocol = /([a-z]+)\:\/\//i;
var patt_domain = /\:\/\/[a-z]+\.(.*)/i;
var subdomain = str.match(patt_subdomain);
var protocol = str.match(patt_protocol);
var domain = str.match(patt_domain);
console.log("Subdomain: " + subdomain[1]);
console.log("Protocol: " + protocol[1]);
console.log("Domain: " + domain[1]);
这是输出:
Subdomain: abc
Protocol: https
Domain: domain-name.co
它基本上是基于://
在任何URL中都是常量的事实,而. (dot)
将URL划分为多个部分。因此,例如子域捕获[a-z]+
和//
之间的. (dot)
组。请注意,如果URL没有任何子域,则第一个正则表达式会捕获整个域。
编辑(更好的解决方案)
正如@Rup在评论中提到的,这是一个单一的正则表达式解决方案:
var str = "https://abc.domain-name.co";
var patt = /(.*)\:\/\/([a-z]+)\.(.*)/i;
var result = str.match(patt);
console.log("Subdomain: " + result[2]);
console.log("Protocol: " + result[1]);
console.log("Domain: " + result[3]);