我有一些类似的网址
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解析为字符串数组的原因。
答案 0 :(得分:1)
据我了解您的要求,这些应该是捕获子域,域和协议的正则表达式:
子域:\/\/([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]);