首页 > 解决方案 > 正则表达式将 URL 转换为部分

问题描述

我有几个网址,例如

https//abc.domain-name.co

https//*.domain-name.co 

*//*.domain-name.co

这里 * 表示可以有包罗万象的条件。例如

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

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

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

要求的结果:

for : *//posts.com

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

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

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

标签: javascriptregex

解决方案


据我了解你在问什么,这些应该是捕获子域、域和协议的正则表达式:

  • 子域:\/\/([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 划分为多个部分。因此,例如 subdomain 捕获 和之间的[a-z]+组。请注意,如果 URL 没有任何子域,则第一个正则表达式会捕获整个域。//. (dot)

编辑(更好的解决方案)

正如@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]);

推荐阅读