【问题标题】:Regex to retrieve domain.extension from a url正则表达式从 url 检索 domain.extension
【发布时间】:2018-09-06 03:12:10
【问题描述】:

我需要想出一个正则表达式来仅从 url 中提取 domainname.extension。现在我有一个去掉“www”的正则表达式。来自主机名,但我需要更新正则表达式以从主机名中删除任何子域字符串:

这会剥离 www.:

window.location.hostname.replace(/^www\./i, '')

但我需要检测 abc.def.test.com 或 ghi.test.com 上的任何子域信息以将其替换为空字符串并始终返回“test.com”

【问题讨论】:

  • 你需要这样的东西\w+\.(?=\w+\.)
  • 谢谢,但这只会去掉第一个子域
  • 你也应该使用g修饰符:window.location.hostname.replace(/\w+\.(?=\w+\.)/g, '')
  • 如果你不需要正则表达式,你可以使用 split+filter+join ("1.2.3.4.5".split('.').filter((c, i, a) => i > a.length - 3).join('.'))
  • 聪明的选择

标签: javascript regex


【解决方案1】:

您可以使用 replace 方法获得相同的结果,但 match 更合适:

console.log(
    window.location.hostname.match(/[^\s.]+\.[^\s.]+$/)[0]
);
  • [^\s.]+ 匹配除点以外的非空白字符
  • $断言输入字符串结束

根据 cmets 使用替换方法:

console.log(
    window.location.hostname.replace(/[^\s.]+\.(?=[^\s.]\.)/g, '')
);

【讨论】:

  • 我参加了比赛,但我注意到替换正则表达式不会改变字符串:“www.stackoverflow.com”.replace(/[^\s.]+\.(?= [^\s.]\.)/g, '') 返回“www.stackoverflow.com”
  • 是的,我错过了一个量词:[^\s.]+\.(?=[^\s.]*\.)
【解决方案2】:

嗯,这主要取决于您将什么定义为域以及如何定义子域。我将使用最通用的方法将顶级域视为最后两个子组件(就像您在 test.com 中使用的那样)在这种情况下,您可以继续:

([a-zA-Z0-9-]+\.)*([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+) ==> $2

如您所见,正则表达式分为两组,我们只得到输出中的第二组,即最后两个域组件。 [a-zA-Z0-9-] 子表达式需要一些解释,因为它在正则表达式中出现三次:它是域组件中允许的字符集,包括 - 连字符。有关工作演示,请参阅 [1]。

如果您想处理上一个演示中发布的co.uk 示例,将www.test.co.uk 匹配为test.co.uk,那么您必须将您的正则表达式锚定到末尾(使用$,或者如果你在一个 url 的中间,下一个 :/ 可以跟在域名后面),以避免前缀被检测为有效域,如 [2] 中所示:

(([a-zA-Z-9-]+\.)*?)([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+(\.(uk|au|tw|cn))?)$ ==> $3

或 [3]

(([a-zA-Z-9-]+\.)*?)([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+(\.(uk|au|tw|cn))?)(?=[:/]|$) ==> $3

当然,您必须在列表中列出所有遵循使用顶级域名作为其结构下的前缀的惯例的国家/地区。您必须在这里小心,因为并非所有国家/地区都遵循这种方法。我在这里使用了非贪婪的*? 运算符,好像我没有,然后组匹配没有达到预期(第一组变得贪婪,匹配再次在co.uk 而不是@ 987654338@)

但是由于您最终必须锚定您的正则表达式(主要是因为您可以在 url 的查询字符串部分或子路径部分中包含域名,最好将其锚定到整个 url。

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2011-12-19
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多