【问题标题】:Best way to split URL into array in clean way?以干净的方式将 URL 拆分为数组的最佳方法?
【发布时间】:2019-12-24 08:16:24
【问题描述】:

我需要在用户 URL 的不同输入中提取目录和文件名。

一些例子包括:

真正需要的是TOP_PROD_IMAGEWS-25612-BK_IMRO_1.jpg 文件名。

因此,我需要考虑输入 http://https:// 或仅输入 www 的用户。所以我尝试使用string.split('/'),但这显然不适用于所有情况。在用户输入 http 的情况下,尽管有双 //,但有什么东西可以给我一个数组吗?谢谢!

【问题讨论】:

  • 我会为此使用 path-to-regexp。它在 Express 内部使用,并且非常健壮。 npmjs.com/package/path-to-regexp 如果这真的只是一次性用例,您可以直接使用正则表达式。
  • ([^/]+)\/([^/]+)$ 作为正则表达式?
  • 这个问题让我想起了一个类似的here 但是这个问题应该容易很多。

标签: javascript regex


【解决方案1】:

考虑:

const [file, folder] = url.split('/').reverse();

有了这个你就不需要考虑http://或任何//

【讨论】:

    【解决方案2】:

    怎么样:

    const url = new URL('https://foo/s3.amazonaws.com/TOP_PROD_IMAGE/WS-25612-BK_IMRO_1.jpg')
    const urlParams = url.pathname.split('/') // you'll get array here, so inspect it and get last two items
    

    这能解决问题吗?您将在pathname 中得到您所需要的。

    【讨论】:

    • 也优雅地处理了查询参数
    • 哇,这太棒了!无论如何也要隔离文件名?我想我可以和URL.pathname 一起工作,让它们分开会更好。
    • 下面的答案将带您到达那里。来自@C_Ogoo 的回答。
    【解决方案3】:

    如果 url 必须以 http 和可选的 swww. 开头,您还可以使用具有 2 个捕获组的模式来获取最后一个斜杠之前的部分和最后一个斜杠之后的部分。

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

    Regex demo

    urls = [
      "https://foo/s3.amazonaws.com/TOP_PROD_IMAGE/WS-25612-BK_IMRO_1.jpg",
      "http://192.168.12.44:8090/TOP_PROD_IMAGE/R3CRDT-HZWT_IMRO_1.jpg",
      "www.foobar-images.s3.amazonaws.com/TOP_PROD_IMAGE/WS-25612-BK_IMRO_1.jpg"
    ].forEach(s => {
      let m = s.match(/^(?:https?:\/\/|www\.)\S+\/([^/]+)\/(\S+)$/, s);
      console.log(m[1]);
      console.log(m[2]);
      console.log("\n");
    });

    【讨论】:

      【解决方案4】:

      您可以使用负前瞻来仅匹配最终的 URI 段:

      /(?!([https?:\/\/]|[www.]))(?!([\d]))(?!(.*[com])).*/

      const re = /(?!([https?:\/\/]|[www.]))(?!([\d]))(?!(.*[com])).*/
      const arr = [
        "https://foo/s3.amazonaws.com/TOP_PROD_IMAGE/WS-25612-BK_IMRO_1.jpg",
        "http://192.168.12.44:8090/TOP_PROD_IMAGE/R3CRDT-HZWT_IMRO_1.jpg",
        "www.foobar-images.s3.amazonaws.com/TOP_PROD_IMAGE/WS-25612-BK_IMRO_1.jpg"
      ]
      
      const res = arr.map(str => re.exec(str)[0].split("/"))
      
      console.log(res)

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 2022-01-03
        • 2011-10-18
        • 2015-09-30
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 2011-08-06
        • 2012-04-06
        相关资源
        最近更新 更多