我正在尝试编写一个正则表达式以从 url 获取文件名(如果存在)。
这是我到目前为止所拥有的:
(?:[^/][\d\w\.]+)+$
所以从 url http://www.foo.com/bar/baz/filename.jpg
,我应该匹配filename.jpg
不幸的是,我匹配最后一个之后的任何内容/
。
我怎样才能收紧它,以便它只在它看起来像一个文件名时才抓住它?
我正在尝试编写一个正则表达式以从 url 获取文件名(如果存在)。
这是我到目前为止所拥有的:
(?:[^/][\d\w\.]+)+$
所以从 url http://www.foo.com/bar/baz/filename.jpg
,我应该匹配filename.jpg
不幸的是,我匹配最后一个之后的任何内容/
。
我怎样才能收紧它,以便它只在它看起来像一个文件名时才抓住它?
上面的示例无法从此 URL 获取文件名“file-1.name.zip”:
"http://sub.domain.com/sub/sub/handler?file=data/file-1.name.zip&v=1"
所以我创建了我的 REGEX 版本:
[^/\\&\?]+\.\w{3,4}(?=([\?&].*$|$))
解释:
[^/\\&\?]+ # file name - group of chars without URL delimiters
\.\w{3,4} # file extension - 3 or 4 word chars
(?=([\?&].*$|$)) # positive lookahead to ensure that file name is at the end of string or there is some QueryString parameters, that needs to be ignored
这个对我很有效。
(\w+)(\.\w+)+(?!.*(\w+)(\.\w+)+)
非PCR
(?:[^/][\d\w\.]+)$(?<=\.\w{3,4})
聚合酶链反应
(?:[^/][\d\w\.]+)$(?<=(?:.jpg)|(?:.pdf)|(?:.gif)|(?:.jpeg)|(more_extension))
由于您使用regexpal.com
基于 javascript 的测试(不支持后视),请尝试使用此方法
(?=\w+\.\w{3,4}$).+
(?:.+\/)(.+)
选择所有直到最后一个正斜杠 (/),捕获此正斜杠之后的所有内容。使用子模式 $1。
我正在使用这个:
(?<=\/)[^\/\?#]+(?=[^\/]*$)
解释:
(?<=):正面看后面,断言一个字符串有这个表达式,但不匹配。
(?<=/): 正斜杠“/”后面的正向查找,这意味着我正在寻找一个前面的表达式,但与正斜杠不匹配。
[^/\?#]+:一个或多个不是“/”、“?”的字符 或“#”,剥离搜索参数和哈希。
(?=[^/]*$): 积极向前看任何不匹配斜线的东西,然后匹配行尾。这是为了确保选择最后一个正斜杠段。
示例用法:
const urlFileNameRegEx = /(?<=\/)[^\/\?#]+(?=[^\/]*$)/;
const testCases = [
"https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#yo",
"https://developer.mozilla.org/static/fonts/locales/ZillaSlab-Regular.subset.bbc33fb47cf6.woff2",
"https://developer.mozilla.org/static/build/styles/locale-en-US.520ecdcaef8c.css?is-nice=true"
];
testCases.forEach(testStr => console.log(`The file of ${testStr} is ${urlFileNameRegEx.exec(testStr)[0]}`))
它也可能有效:
(\w+\.)+\w+$
你知道你的分隔符是什么样的,所以你不需要正则表达式。只是split
字符串。由于您没有提及语言,因此这是 Perl 中的一个实现:
use strict;
use warnings;
my $url = "http://www.foo.com/bar/baz/filename.jpg";
my @url_parts = split/\//,$url;
my $filename = $url_parts[-1];
if(index($filename,".") > 0 )
{
print "It appears as though we have a filename of $filename.\n";
}
else
{
print "It seems as though the end of the URL ($filename) is not a filename.\n";
}
当然,如果您需要担心特定的文件扩展名(png、jpg、html 等),请适当调整。
> echo "http://www.foo.com/bar/baz/filename.jpg" | sed 's/.*\/\([^\/]*\..*\)$/\1/g'
filename.jpg
假设您将使用 javascript:
var fn=window.location.href.match(/([^/])+/g);
fn = fn[fn.length-1]; // get the last element of the array
alert(fn.substring(0,fn.indexOf('.')));//alerts the filename
这是您可以使用的代码:
\/([\w.][\w.-]*)(?<!\/\.)(?<!\/\.\.)(?:\?.*)?$
名称“。” 和“..”不被认为是正常的。
你可以在这里玩这个正则表达式https://regex101.com/r/QaAK06/1/:
如果您使用的是JavaScript URL 对象,您可以将路径名与以下 RegExp 结合使用:
.*\/(.[^(\/)]+)
它匹配路径末尾的任何内容,但不包括可能的斜杠(只要没有两个斜杠)!
试试这个:
(?:[^/]*+)$(?<=\..*)
这对我有用,不管你是否有'。或没有“。” 它需要 url 的后缀
\/(\w+)[\.|\w]+$