簡體   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