【问题标题】:Regular expression to remove hostname and port from URL?从 URL 中删除主机名和端口的正则表达式?
【发布时间】:2010-10-01 07:15:58
【问题描述】:

我需要编写一些 javascript 来从 url 中去除 hostname:port 部分,这意味着我只想提取路径部分。

即我想写一个函数 getPath(url) 使得 getPath("http://host:8081/path/to/something") 返回 "/path/to/something"

这可以使用正则表达式来完成吗?

【问题讨论】:

  • 这根本不需要正则表达式 - 看我的回答:)
  • 并不是不需要正则表达式。这不应该使用正则表达式来完成。
  • 但是知道还是有用的。

标签: javascript regex


【解决方案1】:

RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt) 在附录 B 中说

下面这行是分解a的正则表达式 对其组件的格式良好的 URI 引用。

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9

上面第二行的数字只是为了便于阅读; 它们指示每个子表达式的参考点(即,每个 双括号)。我们指的是子表达式匹配的值 作为$。例如,将上面的表达式匹配到

  http://www.ics.uci.edu/pub/ietf/uri/#Related

导致以下子表达式匹配:

  $1 = http:
  $2 = http
  $3 = //www.ics.uci.edu
  $4 = www.ics.uci.edu
  $5 = /pub/ietf/uri/
  $6 = <undefined>
  $7 = <undefined>
  $8 = #Related
  $9 = Related

其中&lt;undefined&gt; 表示该组件不存在,原样 上例中查询组件的情况。因此,我们 可以将五个分量的值确定为

  scheme    = $2
  authority = $4
  path      = $5
  query     = $7
  fragment  = $9

【讨论】:

  • 正则表达式错误地被**和**包围。
  • 一个彻底的回复,我觉得它很有用——尽管不如接受的答案那么直接。谢谢。
【解决方案2】:

我知道正则表达式很有用,但在这种情况下它们不是必需的。 Location 对象是 DOM 中所有链接的固有属性,并且具有路径名属性。

因此,要访问某个随机 URL 的该属性,您可能需要创建一个新的 DOM 元素,然后返回其路径名。

一个总是能完美运行的例子:

function getPath(url) {
    var a = document.createElement('a');
    a.href = url;
    return a.pathname.substr(0,1) === '/' ? a.pathname : '/' + a.pathname;
}

jQuery 版本:(如果需要,使用正则表达式添加前导斜杠)

function getPath(url) {
    return $('<a/>').attr('href',url)[0].pathname.replace(/^[^\/]/,'/');
}

【讨论】:

  • 我知道这是一个旧帖子,但我真的很喜欢你的方法 J-P :)
  • 请注意,这仅在您有 DOM 时才有效。在 node.js 或 web worker 等环境中,没有 DOM。 (在 2009 年写这个答案时可能不是一个常见的情况......)
【解决方案3】:

快速'n'脏:

^[^#]*?://.*?(/.*)$

主机名和端口之后的所有内容(包括开头的 /)都被捕获在第一组中。

【讨论】:

  • 或正则表达式文字形式(“/”需要转义):/^.*?:\/\/.*?(\/.*)$/.exec("@ 987654321@ 给出“/folder/file.ext”
  • 这个正则表达式是错误的。它捕获第 1 组中的路径、查询和片段。
  • 完全不需要正则表达式!不过不错!
  • @mikesamuel,问题要求删除主机名和端口。不过,我会更正我的答案以获得合适的解释。
  • @strager,这不是仍会将一些没有方案或权限部分的 URL 转换为有的 URL。例如 #foo://bar//example.com/ 没有方案或权限,但您的正则表达式会将其更改为具有权限 //example.com/ 的协议相对 URL。
【解决方案4】:

window.location 对象具有路径名、搜索和哈希属性,其中包含您需要的内容。

对于这个页面

location.pathname = '/questions/441755/regular-expression-to-remove-hostname-and-port-from-url'  
location.search = '' //because there is no query string
location.hash = ''

所以你可以使用

var fullpath = location.pathname+location.search+location.hash

【讨论】:

    【解决方案5】:

    很简单:

    ^\w+:.*?(:)\d*
    

    试图找到第二次出现的“:”,后面是数字,前面是 http 或 https。

    这适用于以下两种情况

    例如:

    http://localhost:8080/myapplication

    https://localhost:8080/myapplication

    希望这会有所帮助。

    【讨论】:

      【解决方案6】:

      这个正则表达式似乎有效:(http://[^/])(/.)

      作为测试,我在文本编辑器中运行了这个搜索和替换:

       Search: (http://[^/]*)(/.*)
      Replace: Part #1: \1\nPart #2: \2  
      

      它转换了这个文本:

      http://host:8081/path/to/something
      

      进入这个:

      Part #1: http://host:8081
      Part #2: /path/to/something
      

      并转换为:

      http://stackoverflow.com/questions/441755/regular-expression-to-remove-hostname-and-port-from-url
      

      进入这个:

      Part #1: http://stackoverflow.com
      Part #2: /questions/441755/regular-expression-to-remove-hostname-and-port-from-url
      

      【讨论】:

        猜你喜欢
        • 2012-07-18
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多