如何仅从 Javascript 中的完整路径中提取文件名 + 扩展名?
How to extract filename + extension only from full path in Javascript?
从 API 返回的文件路径如下所示:
https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97
我想提取文件名和扩展名,并替换任何 ASCII 表达式,如 %20。所以最终返回的结果应该是:
Corp_Data_Collection.pdf
关于如何在 Javascript 中完成这项工作有什么想法吗?
您可以 JavaScript 的 URL
构造函数从 URL 获取路径名,如下所示:
const url = new URL("https://yourlongurl.com/something/yourfile.pdf");
const pathname = url.pathname;
从路径名中,您可以使用 substring
提取它的最后一部分,如下所示:
const filename = unescape(pathname.substring(pathname.lastIndexOf('/') + 1));
这将 return "yourfile.pdf"
let link =
"https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97";
let regex = link.match(/.+?(?=\?)/)[0].split("/");
console.log(decodeURIComponent(regex[regex.length - 1]));
// Corp Data Collection.pdf
/.+?(?=\?)/
此正则表达式将匹配字符“?”之前的任何内容。找到(不包括该字符)。
然后,获取第一个匹配元素并将字符串拆分为数组(使用“/”)。
然后,解码数组的最后一个元素
如果你想用 RegEx 明确地做到这一点,你可以使用这个 RegEx:
\/([^\/]*\.[^\/]*)\?
\/
按字面匹配(正向)斜杠。
[^\/]*
匹配除斜杠以外的所有内容 0 次以上。
\.
按字面意思匹配 .
。
[^\/]*\.[^\/]*
两边的括号从这场比赛中抽出一组。
\?
按字面意思匹配 ?
。
您可以使用这个 JS 代码:
const regex = /\/([^\/]*\.[^\/]*)\?/gm;
const str = `https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
我最终得到的解决方案:
file = file_path.replace(/^(?:[^/?]/)([^/?])./g, 函数(a,b) { return unescape(b); });
从 API 返回的文件路径如下所示:
https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97
我想提取文件名和扩展名,并替换任何 ASCII 表达式,如 %20。所以最终返回的结果应该是:
Corp_Data_Collection.pdf
关于如何在 Javascript 中完成这项工作有什么想法吗?
您可以 JavaScript 的 URL
构造函数从 URL 获取路径名,如下所示:
const url = new URL("https://yourlongurl.com/something/yourfile.pdf");
const pathname = url.pathname;
从路径名中,您可以使用 substring
提取它的最后一部分,如下所示:
const filename = unescape(pathname.substring(pathname.lastIndexOf('/') + 1));
这将 return "yourfile.pdf"
let link =
"https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97";
let regex = link.match(/.+?(?=\?)/)[0].split("/");
console.log(decodeURIComponent(regex[regex.length - 1]));
// Corp Data Collection.pdf
/.+?(?=\?)/
此正则表达式将匹配字符“?”之前的任何内容。找到(不包括该字符)。
然后,获取第一个匹配元素并将字符串拆分为数组(使用“/”)。
然后,解码数组的最后一个元素
如果你想用 RegEx 明确地做到这一点,你可以使用这个 RegEx:
\/([^\/]*\.[^\/]*)\?
\/
按字面匹配(正向)斜杠。
[^\/]*
匹配除斜杠以外的所有内容 0 次以上。
\.
按字面意思匹配 .
。
[^\/]*\.[^\/]*
两边的括号从这场比赛中抽出一组。
\?
按字面意思匹配 ?
。
您可以使用这个 JS 代码:
const regex = /\/([^\/]*\.[^\/]*)\?/gm;
const str = `https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
我最终得到的解决方案:
file = file_path.replace(/^(?:[^/?]/)([^/?])./g, 函数(a,b) { return unescape(b); });