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

时间:2015-06-29 22:36:58

标签: regex

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

以下是我正在使用的网址示例。

http://some-website.s3.amazonaws.com/lovecraft-05.epub?AWSAccessKeyId=KJHFHGFDSXF&Expires=3568732&Signature=%3JHF%3KUHF%2Bnuvnu%5LHF%3D

我想抓住位于" /"之间的文件名。和"?"

所以我要找的价值是" lovecraft-05.epub"

4 个答案:

答案 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)

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

amazonaws.com\/([^\?]+)

编码时,您需要找到group(1)匹配 有关说明,请参阅DEMO

答案 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的查询部分可能是可选的。如果查询部分不在此处,则文件名后面可以跟着片段部分或字符串的结尾。