以干净的方式将URL拆分为数组的最佳方法?

时间:2019-12-23 23:02:27

标签: javascript regex

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

一些例子包括:

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

因此,我需要考虑输入http://https://或仅输入www的用户。因此我尝试使用string.split('/'),但显然并非在所有情况下都可行。在用户输入http的情况下,尽管输入了两个//,是否可以给我一个数组?谢谢!

4 个答案:

答案 0 :(得分:5)

考虑:

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

使用此方法,您无需考虑http://或任何//

答案 1 :(得分:4)

怎么样:

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中获得所需的东西。

答案 2 :(得分:0)

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

^(?: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");
});

答案 3 :(得分:0)

您可以使用否定前瞻仅匹配最终的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)