我有一个包含文件名的网址。我想创建一个函数,使用正则表达式隔离文件名,然后将其保存为变量。设置函数并将字符串保存为变量非常简单。我正在努力使用正则表达式来隔离字符串。
以下是我正在使用的网址示例。
我想抓住位于" /"之间的文件名。和"?"
所以我要找的价值是" lovecraft-05.epub"
答案 0 :(得分:0)
文本
http://some-website.s3.amazonaws.com/lovecraft-05.epub?AWSAccessKeyId=KJHFHGFDSXF&Expires=3568732&Signature=%3JHF%3KUHF%2Bnuvnu%5LHF%3D
正则表达式(使用Perl):
\.com\/(.*)\?
输出
Match 1: .com/lovecraft-05.epub? 32 23
Group 1: lovecraft-05.epub 37 17
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以使用/\/([^\/?]+)\?/
:
perl one-liner
echo "http://some-website.s3.amazonaws.com/lovecraft-05.epub?AWS?AccessKeyId=KJHFHGFDSXF&Expires=3568732&Signature=%3JHF%3KUHF%2Bnuvnu%5LHF%3D" \
| perl -ne 'print $1 if m=/([^/?]+)\?='
返回lovecraft-05.epub0
。
答案 3 :(得分:0)
我认为有两种方法可以做到:
function get_filename_from_url($url) {
return ltrim(strrchr(parse_url($url, PHP_URL_PATH), '/'), '/');
}
或preg_match
:
function get_filename_from_url($url) {
return preg_match('~(?<!:/)/\K[^/]*?(?=[?#]|$)~', $url, $m) ? $m[0] : '';
}
模式的含义:
~ # pattern delimiter
(?<!:/) # not preceded by :/
/ # literal slash
\K # discard character(s) on the left from the match result
[^/]*? # zero or more characters that are not a slash
(?=[?#]|$) # followed by a ? or a # or the end of the string
~
请注意,当网址格式不正确时,我默认选择返回空字符串,显然您可以选择不同的行为。
以正则表达式方式,除了问号之外,还需要测试#
或字符串的结尾,因为url的查询部分可能是可选的。如果查询部分不在此处,则文件名后面可以跟着片段部分或字符串的结尾。