【问题标题】:How to extract the host from a URL in JavaScript?如何从 JavaScript 中的 URL 中提取主机?
【发布时间】:2012-11-10 11:35:54
【问题描述】:

捕获域直到结束字符$, \?, /, :。我需要一个在所有这些中捕获domian.com 的正则表达式。

domain.com:3000
domain.com?pass=gas
domain.com/
domain.com

【问题讨论】:

标签: javascript node.js parsing url


【解决方案1】:

我正在使用 Node ^10,这就是我从 URL 中提取主机名的方式。

var url = URL.parse('https://stackoverflow.com/q/13506460/2535178')
console.log(url.hostname)
//=> stackoverflow.com

【讨论】:

    【解决方案2】:

    新的挑战者出现了。根据节点文档,您也可以使用

       var url = new URL(urlString);
       console.log(url.hostname);
    

    https://nodejs.org/api/url.html#url_the_whatwg_url_api

    这似乎是一种更流行的方式。

    【讨论】:

      【解决方案3】:

      如果您确实有有效的 URL,这将起作用:

      var urls = [
          'http://domain.com:3000',
          'http://domain.com?pass=gas',
          'http://domain.com/',
          'http://domain.com'
      ];
      
      for (x in urls) {
          var a = document.createElement('a');
          a.href = urls[x];
          console.log(a.hostname);
      }
      
      //=> domain.com
      //=> domain.com
      //=> domain.com
      //=> domain.com
      

      注意,当您使用的语言有其他内置方法时,使用正则表达式处理这种事情是愚蠢的。

      A 元素上可用的其他属性。

      var a = document.createElement('a');
      a.href = "http://domain.com:3000/path/to/something?query=string#fragment"
      
      a.protocol   //=> http:
      a.hostname   //=> domain.com
      a.port       //=> 3000
      a.pathname   //=> /path/to/something
      a.search     //=> ?query=string
      a.hash       //=> #fragment
      a.host       //=> domain.com:3000
      

      编辑#2

      经过进一步考虑,我查看了 Node.js 文档并发现了这个小宝石:url#parse

      上面的代码可以改写为:

      var url = require('url');
      
      var urls = [
          'http://domain.com:3000',
          'http://domain.com?pass=gas',
          'http://domain.com/',
          'http://domain.com'
      ];
      
      for (x in urls) {
          console.log(url.parse(urls[x]).hostname);
      }
      
      //=> domain.com
      //=> domain.com
      //=> domain.com
      //=> domain.com
      

      编辑 #1

      如果您想了解如何使用jsdom 和nodejs 解决此问题,请查看此帖子的修订历史

      【讨论】:

      • javascript 但我真的很喜欢正则表达式
      • 这很好,但我在服务器端工作。没有文档=[。可能是一种伪造的方式。
      • 你听说过jsdom吗?此外,您应该提到您在标签中使用了类似 node.js 的东西:P
      • @ThomasReggi,我发现 nodejs 有它自己的 url#parse 方法。请参阅上面的编辑#2。
      • 使用 DOM 对象不是 JS 特性,而是 DOM 绑定特性。许多 JS 环境中不存在 DOM。此外,它非常慢,执行简单字符串解析的正确方法是完全使用正则表达式。
      【解决方案4】:
      /^((?:[a-z0-9-_]+\.)*[a-z0-9-_]+\.?)(?::([0-9]+))?(.*)$/i
      

      匹配主机、端口、路径

      【讨论】:

      • 不起作用:s="stackoverflow.com/questions/13506460/…" s.match(/^((?:[a-z0-9-]+\.)*[a-z0- 9-]+\.?)(?::([0-9]+))?(.*)$/i) 给出以下结果: ["stackoverflow.com/questions/13506460/…", "http",未定义,“://stackoverflow.com/questions/13506460/how-to-extract-the-host-from-a-url-in-javascript”]
      • 请不要发布假测试。您的结果包含字符串"http" 作为匹配字符串,而您说您运行正则表达式的字符串不包含"http" 子字符串。您可以修补 jS 虚拟机的执行结果或源代码来实现此结果。 "stackoverflow.com/questions/13506460/how-to-extract...".match(/^((?:[a-z0-9-]+\.)*[a-z0-9-]+\.?)(?::([0-9]+))?(.*)$/i) 工作得非常好导致["stackoverflow.com/questions/13506460/how-to-extract...", "stackoverflow.com", undefined, "/questions/13506460/how-to-extract..."]
      • 不,stackoverflow 自动剪切 url... 现在,请检查这个小提琴:jsfiddle.net/WLGmv,如果我做错了什么,请告诉我。
      • 当然可以。您尝试将此正则表达式用于错误的目的。如果您重新阅读原始问题,它不应该做您想做的事。您需要使用 URI 方案解析 URL,试试这个:/^(?:https?:\/\/)?((?:[a-z0-9-_]+\.)*[a-z0-9-_]+\.?)(?::([0-9]+))?(.*)$/i(仅适用于 http 和 https 或根本没有 URI 方案)。小提琴在这里:jsfiddle.net/WLGmv/1
      【解决方案5】:

      由于你使用的是node,所以使用内置的url.parse()方法即可;你想要得到的hostname 属性:

      var url=require('url');
      var urls = [
        'http://domain.com:3000',
        'http://domain.com?pass=gas',
        'http://domain.com/',
        'http://domain.com'
      ];
      

      更新:

      urls.forEach(function(x) {
        console.log(url.parse(x).hostname);
      });
      

      【讨论】:

      • 返回{ pathname: '0', path: '0', href: '0' } { pathname: '1', path: '1', href: '1' } { pathname: '2', path: '2', href: '2' } { pathname: '3', path: '3', href: '3' }
      • 错误的测试工具(从另一个答案复制),在我的答案中更新。教训:不要使用for (...in...) 来遍历数组。
      • 它包括子域
      猜你喜欢
      • 2010-11-24
      • 2018-05-31
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多