我有一些URL,例如
https//abc.domain-name.co
https//*.domain-name.co
*//*.domain-name.co
在这里 *意味着可以有全部条件。例如
*//域>允许所有协议
我需要提取
的正则- 协议
- 域
- 子域
- 主机名
所需的结果:
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分为部分。因此,例如子域在//
和. (dot)
之间捕获[a-z]+
组。请注意,如果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]);