正则表达式将隐秘URL分成部分

时间:2019-03-05 15:33:20

标签: javascript regex

我有一些类似的网址

https//abc.domain-name.co

https//*.domain-name.co 

*//*.domain-name.co

此处*表示可能存在全部情况。例如

  

* //。domains>允许的所有协议

我需要一个正则表达式来提取

  1. 协议
  2. 子域
  3. 主机名

必填结果:

for : *//posts.com

 "protocol": "*",
 "hostname": "posts.com",

for *//*.posts.com
  protocol: '*',
  hostname: '*.posts.com',

我无法使用URL(js),因为它需要有效的网址,并且添加*会使url无效,这就是为什么需要使用正则表达式将url解析为字符串数组的原因。

1 个答案:

答案 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]);