【问题标题】:Regex URL Path from URL来自 URL 的正则表达式 URL 路径
【发布时间】:2012-08-14 22:38:21
【问题描述】:

我遇到了一点正则表达式问题。

我正在尝试获取此 url videoplay 中的路径。

http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello

如果我使用这个正则表达式 /.+ 它也匹配 /video

我需要某种反/否定匹配来不包括//

【问题讨论】:

  • 当我必须在 url 上使用正则表达式又快又脏时,我通常在开头包含 // 在捕获组之前。请注意,您不能使用 http://,因为他们可能使用不同的协议访问它,甚至是 ://,因为他们可能会指定端口号。
  • Getting parts of a URL (Regex) 的可能重复项

标签: javascript regex node.js url


【解决方案1】:

如果您的 JavaScript 网络应用需要此功能:我在此主题上找到的最佳答案是 here。代码的基本(也是原始)版本如下所示:

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.host;     // => "example.com:3000"

感谢约翰·朗,你造就了白昼!

【讨论】:

    【解决方案2】:

    (http[s]?:\/\/)?([^\/\s]+\/)(.*) 第 3 组
    演示:http://regex101.com/r/vK4rV7/1

    【讨论】:

    • 如果有www.abc.com?param=xyz 之类的路径,它将不起作用。我像这样稍微修改它以使其工作(我也对前两组使用不匹配的组)。 (?:https?:\/\/)?(?:[^?\/\s]+[?\/])(.*) 演示:regex101.com/r/eNUBb9
    【解决方案3】:

    此表达式获取videoplay 之后的所有内容,即 url 路径。

    /\/(videoplay.+)/
    

    此表达式获取端口之后的所有内容。也包括路径。

    /\:\d./(.+)/
    

    但是,如果使用 Node.js,我推荐使用原生的 url 模块。

    var url = require('url')
    var youtubeUrl = "http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello"
    url.parse(youtubeUrl)
    

    所有的正则表达式都适合你。

    {
      protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'video.google.co.uk:80',
      port: '80',
      hostname: 'video.google.co.uk',
      hash: '#hello',
      search: '?docid=-7246927612831078230&hl=en',
      query: 'docid=-7246927612831078230&hl=en',
      pathname: '/videoplay',
      path: '/videoplay?docid=-7246927612831078230&hl=en',
      href: 'http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello' 
    }
    

    【讨论】:

    【解决方案4】:

    你可以试试这个:

    ^(?:[^/]*(?:/(?:/[^/]*/?)?)?([^?]+)(?:\??.+)?)$
    

    ([^?]+) 上面是返回路径的捕获​​组。

    请注意,这不是一个全 URL 正则表达式。它只是解决了匹配“//”之后出现的第一个“/”和后面的“?”之间的所有文本的问题。字符。

    如果您需要一个全匹配的正则表达式,您可以查看此StackOverflow link,他们已经讨论并将 URI 的所有可能性分解为它的组成部分,包括您的“路径”。
    如果您认为这是一种矫枉过正,并且如果您知道您的输入 URL 将始终遵循您的路径在第一个“/”和后面的“?”之间的模式,那么上面的正则表达式就足够了。

    【讨论】:

    【解决方案5】:

    function getPath(url, defaults){
        var reUrlPath = /(?:\w+:)?\/\/[^\/]+([^?#]+)/;
        var urlParts = url.match(reUrlPath) || [url, defaults];
        return urlParts.pop();
    }
    alert( getPath('http://stackoverflow.com/q/123/regex-url', 'unknown') );
    alert( getPath('https://stackoverflow.com/q/123/regex-url', 'unknown') );
    alert( getPath('//stackoverflow.com/q/123/regex-url', 'unknown') );
    alert( getPath('http://stackoverflow.com/q/123/regex-url?foo', 'unknown') );
    alert( getPath('http://stackoverflow.com/q/123/regex-url#foo', 'unknown') );
    alert( getPath('http://stackoverflow.com/q/123/regex-url/', 'unknown') );
    alert( getPath('http://stackoverflow.com/q/123/regex-url/?foo', 'unknown') );
    alert( getPath('http://stackoverflow.com/q/123/regex-url/#foo', 'unknown') );
    alert( getPath('http://stackoverflow.com/', 'unknown') );

    【讨论】:

      【解决方案6】:

      对于新的 Google 员工, 在任何环境下使用 JavaScript web api URL:

      new URL('your url string').pathname
      

      https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

      【讨论】:

      • 这很漂亮。
      【解决方案7】:

      你的意思是消极的回顾? (?<!/)

      【讨论】:

        【解决方案8】:

        var subject =
        '<link rel="shortcut icon" href="https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=ec617d715196"><link rel="apple-touch-icon" href="https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a"><link rel="image_src" href="https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a">';
        var re=/\"[a-z]+:\/\/[^ ]+"/m;
        document.write(subject.match(re));

        你可以试试这个

        /\"[a-z]+:\/\/[^ ]+/
        

        用法

        if (/\"[a-z]+:\/\/[^ ]+/m.test(subject)) {  // Successful match } else {    // Match attempt failed }
        

        【讨论】:

          【解决方案9】:

          它不是正则表达式解决方案,但大多数语言都有一个 URL 库,可以将任何 URL 解析为其组成部分。对于您正在做的事情,这可能是一个更好的解决方案。

          【讨论】:

            【解决方案10】:

            请试试这个:

            ^http[s]?:\/\/(www\.)?(.*)?\/?(.)*
            

            【讨论】:

              【解决方案11】:

              即使使用语言特性的答案很好,这里还有另一种使用 REGEXP 将 URL 拆分为组件的方法:

              ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?
                   ||            |  |          |       |   |        | |
                   12 - scheme   |  |          |       |   |        | |
                                 3  4 - authority, includes hostname/ip and port number.
                                               5 - path|   |        | |
                                                       6   7 - query| |
                                                                    8 9 - fragment
              

              【讨论】:

                【解决方案12】:

                我想这就是你所追求的:[^/]+$

                演示:http://regex101.com/r/rG8gB9

                【讨论】:

                • 这与 URL 的路径不匹配,只是路径的最后一部分。使用“google.com/foo/bar”匹配“bar”
                猜你喜欢
                • 1970-01-01
                • 2020-01-18
                • 1970-01-01
                • 2011-09-07
                • 2023-01-23
                • 2022-08-11
                • 2016-01-10
                • 1970-01-01
                • 2022-11-22
                相关资源
                最近更新 更多