从URL提取顶级域名

时间:2019-06-28 20:34:08

标签: javascript regex

我需要修复此正则表达式以仅获取域。顶级域之后没有子域,文件夹或文件名。我已经开始了。我需要修复正则表达式的帮助

有许多变化要考虑:

  1. http或https
  2. www与否
  3. 多个子域
  4. URL末尾加斜杠
  5. 顶级域名后的文件夹

这是第一部分完成的链接Link

前5个在工作,而后3个在文件夹和文件名下却没有。

到目前为止,这是我的正则表达式 /([a-zA-Z0-9-]+)(\.[a-zA-Z]{2,5})?(\.[a-zA-Z]+$)

结果应为:

  1. domain.com
  2. masterdomain.com.au
  3. luxury.co.uk
  4. globo.us
  5. test.com
  6. google.com.br

2 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

((?<![^\/]\/)\b\w+\.\b\w{2,3}(?:\.\b\w{2})??)(?:$|\/)

Demo

打破模式:

  • (?<![^\/]\/)确保该字符串不以单斜杠开头(因为/index.php看起来像一个域),但可以以双斜杠开头(如https://
  • \b\w+\.捕获了主域,通过使用左侧的单词边界并在右侧要求一个点来确保整个字符串是单词。 (同样,它捕获i中除/index.php之外的所有内容的问题,这就是为什么需要\b的原因。)
  • \b\w{2,3}与顶级域(.com)匹配
  • (?:\.\b\w{2})?)可选,捕获特定国家/地区的TLD(如果有)
  • (?:$|\/)要求整个匹配项后跟字符串$的结尾或斜杠\/

使用前瞻而不是捕获组的替代方案:

(?<![^\/]\/)\b\w+\.\b\w{2,3}(?:\.\b\w{2})?(?=$|\/)

基本上,您需要删除捕获组,并将(?:$|\/)末尾的非捕获组替换为正向(?=$|\/)

Demo

答案 1 :(得分:0)

如果可以的话,我们可以考虑使用具有非捕获组的表达式:

^(?:https?:\/\/)(?:www\.)?([^\/\s]+)$|^(?:https?:\/\/)(?:www\.)?([^\/\s]+)(?:.*)$

Demo