Regex 使用正则表达式获取两个特定字符之间的所有文本

Regex 使用正则表达式获取两个特定字符之间的所有文本,regex,Regex,我有一个包含文件名的url。我想创建一个函数,使用正则表达式隔离文件名,然后将其另存为变量。设置函数并将字符串保存为变量是相当简单的。我正在努力用正则表达式来隔离字符串 下面是一个我正在使用的url示例 我想获取位于“/”和“”之间的文件名 所以我要寻找的值是“lovecraft-05.epub”Text http://some-website.s3.amazonaws.com/lovecraft-05.epub?AWSAccessKeyId=KJHFHGFDSXF&Expires=3

我有一个包含文件名的url。我想创建一个函数,使用正则表达式隔离文件名,然后将其另存为变量。设置函数并将字符串保存为变量是相当简单的。我正在努力用正则表达式来隔离字符串

下面是一个我正在使用的url示例

我想获取位于“/”和“”之间的文件名

所以我要寻找的值是“lovecraft-05.epub”

Text

http://some-website.s3.amazonaws.com/lovecraft-05.epub?AWSAccessKeyId=KJHFHGFDSXF&Expires=3568732&Signature=%3JHF%3KUHF%2Bnuvnu%5LHF%3D
正则表达式(带Perl):

输出

Match 1:    .com/lovecraft-05.epub?     32      23
Group 1:    lovecraft-05.epub       37      17
正文

正则表达式(带Perl):

输出

Match 1:    .com/lovecraft-05.epub?     32      23
Group 1:    lovecraft-05.epub       37      17

此正则表达式选择字符串
amazonaws.com
之后和
字符之前的子字符串:

amazonaws.com\/([^\?]+)
编码时,需要找到
组(1)
匹配项。

请参阅以获取解释。

此正则表达式选择字符串
amazonaws.com
之后和
之前的子字符串?
字符:

amazonaws.com\/([^\?]+)
编码时,需要找到
组(1)
匹配项。
有关说明,请参见。

您可以使用
/\/([^\/?]+)\?/

perl一行程序

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

您可以使用
/\/([^\/?]+)\?/

perl一行程序

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

我看到两种方法:

function get_filename_from_url($url) {
    return ltrim(strrchr(parse_url($url, PHP_URL_PATH), '/'), '/');
}
或使用
预匹配

function get_filename_from_url($url) {
    return preg_match('~(?<!:/)/\K[^/]*?(?=[?#]|$)~', $url, $m) ? $m[0] : '';
}
函数从url($url)获取文件名{
返回预匹配('~(?)?

在正则表达式方式中,需要测试
#
或字符串末尾加问号,因为url的查询部分可能是可选的。如果查询部分不在此处,则文件名后面可以是片段部分或字符串结尾。

我看到两种方法:

function get_filename_from_url($url) {
    return ltrim(strrchr(parse_url($url, PHP_URL_PATH), '/'), '/');
}
或使用
预匹配

function get_filename_from_url($url) {
    return preg_match('~(?<!:/)/\K[^/]*?(?=[?#]|$)~', $url, $m) ? $m[0] : '';
}
函数从url($url)获取文件名{
返回预匹配('~(?)?

在正则表达式中,需要测试
#
或字符串末尾加问号,因为url的查询部分可能是可选的。如果查询部分不在这里,文件名后面可以是片段部分或字符串结尾。

由于正则表达式有不同的风格,您使用什么编程语言?可能是d我不确定。我正在使用WordPress。过去,我搜索直到找到某个东西,然后简单地复制、粘贴和调整直到它起作用。我从来没有声明过味道,或者至少我知道。我希望这听起来不是难以置信的愚蠢。@George应用时请接受答案你使用什么编程语言,就像regex一样不同的口味?可能是重复的我不确定。我正在使用WordPress。过去,我搜索直到找到某样东西,然后简单地复制、粘贴和调整直到它起作用。我从未声明过一种口味,或者至少我知道。我希望这听起来不是难以置信的愚蠢。@George请在适用时接受答案