繁体   English   中英

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

[英]Using a Regular Expression to Grab all text in between two specific characters

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

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

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

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

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

文本

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

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

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

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

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

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), '/'), '/');
}

或与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格式不正确时,我选择默认情况下返回空字符串,显然,您可以选择其他行为。

以正则表达式的方式,由于URL的查询部分可能是可选的,因此需要测试#或除问号之外的字符串结尾。 如果查询部分不在此处,则文件名之后可以是片段部分或字符串的结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM