代码之家  ›  专栏  ›  技术社区  ›  Brad

如果URL包含某个目录,则返回该URL的结尾

  •  0
  • Brad  · 技术社区  · 6 年前

    我需要搜索一个SQL文件并找到URL包含的文件名(URL的末尾)。 /assets/

    示例URL:

    https://www.example.com/assets/screenshots/this-is-an-example/2016-12-20_15-42-29.png
    

    它有 /资产/ 在其中,我想得到URL的最后一部分,是:

    2016-12-20_15-42-29.png
    

    另一个例子:

    https://www.example.com/images/screenshots/this-is-an-example/2016-12-20_15-42-29.png
    

    什么都不会回来,因为 /资产/ 没有找到。

    *目录深度不同,所以可能 /assets/dir1/dir2/filename.jpg 下一个可能是 /assets/dir1/dir2/dir3/dir4/filename.jpg

    希望这可以用正则表达式实现。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Paolo Enigma    6 年前

    您可以使用以下regex:

    ^(?=.*\/assets\/).*\/\K.*$
    
    • ^ 断言字符串的起始位置。
    • (?=.*\/assets\/) 积极前瞻,确保 /assets/ 字符串中存在子字符串。
    • .* 贪婪地匹配任何东西。
    • \/ 最后一个匹配 / .
    • \K 重置运算符,重置匹配项。
    • .*$ 在字符串结束前匹配任何内容 $ .

    here .


    PHP片段:

    <?php
    
    $url = 'https://w...content-available-to-author-only...e.com/assets/screenshots/this-is-an-example/2016-12-20_15-42-29.png';
    preg_match('/^(?=.*\/assets\/).*\/\K.*$/',$url,$matches);
    
    print_r($matches[0]);
    

    印刷品:

    2016-12-20_15-42-29.png
    

    你可以试试 here .

        2
  •  1
  •   dognose    6 年前

    概述如下: basename() 这将是一个很好的解决方法。

    但是,这里有一个regex,如果您喜欢这种方式(或者需要它将其应用于某种防火墙模式字段):

    @^.*?/assets/.*?/([^/]+\.\w{3})$@
    

    (注意分隔符 @ 因为模式包含很多 / 你可以去OFC。坚持 / 作为分隔符,但随后必须对 / 在模式中。)

    https://regex101.com/r/wKhMAk/1

        3
  •  1
  •   bastien    6 年前

    尝试一下:

    这个 strpos() 将检查搜索字符串 /资产/ 存在于URL中。

    如果它确实存在,它将从提供的URL返回搜索字符串的位置 $url . 否则,它将返回false。

    这里我使用三元运算符(if else语句的缩写)来评估条件。如上所述,如果存在搜索字符串,它将返回路径的文件名( $URL )通过函数 basename() 如果找不到搜索字符串,则返回空值。

    $url = "https://www.example.com/images/assets/screenshots/this-is-an-example/2016-12-20_15-42-29.png";
    
    $endOfUrl = strpos($url, '/assets/') !== false ? basename($url) : '';
    
    echo $endOfUrl;