【问题标题】:Regular Expression to collect everything after the last /正则表达式收集最后 / 之后的所有内容
【发布时间】:2009-07-19 18:45:22
【问题描述】:

我是正则表达式的新手,想知道如何使用一个短语来收集最后一个 / 之后的所有内容。

我正在提取 Google 的 GData 使用的 ID。

我的示例字符串是

http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123

ID 在哪里:p1f3JYcCu_cb0i0JYuCu123

哦,我正在使用 PHP。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这匹配至少一个(任何不是斜杠),后跟字符串结尾:

    [^/]+$
    


    备注:

    • 没有括号,因为它不需要任何组 - 结果进入第 0 组(匹配本身)。
    • 使用+(而不是*),因此如果最后一个字符是斜线,则无法匹配(而不是匹配空字符串)。


    但是,最有可能更快更简单的解决方案是使用您的语言的内置字符串列表处理功能 - 即 ListLast( Text , '/' ) 或等效函数。

    对于 PHP,最接近的函数是 strrchr,其工作原理如下:

    strrchr( Text , '/' )
    

    这包括结果中的斜线 - 根据下面 Teddy 的评论,您可以使用 substr 删除斜线:​​

    substr( strrchr( Text, '/' ), 1 );
    

    【讨论】:

    • +1 用于使用非正则表达式解决方案。对 URL 进行子字符串化会更快,并且可以避免导入正则表达式支持。
    • 确实 - 我怀疑大多数功能会从最后开始向后工作,因此避免检查大多数字符。 Afaik 所有正则表达式引擎都向前工作,因此必须检查每个字符。
    • 感谢您的帮助,我知道对正则表达式有了更好的理解。 PHP 代码如下所示。 preg_match('([^/]+$)', "spreadsheets.google.com/feeds/spreadsheets/…", $matches)
    • 非正则表达式解决方案的另一个 +1。更快。
    • 如果你想删除'/',你可以这样做; substr( strrchr( Text, '/' ), 1 );
    【解决方案2】:

    一般:

    /([^/]*)$
    

    您想要的数据将是第一组的匹配项。


    编辑   由于您使用的是 PHP,您还可以使用 strrchr,它返回从字符串中最后一次出现的字符到结尾的所有内容。或者您可以使用strrpossubstr 的组合,首先找到最后一次出现的位置,然后从该位置获取子字符串直到最后。或者explodearray_pop,在/ 处拆分字符串,得到最后一部分。

    【讨论】:

    • 您可能需要对字符类中的斜线进行转义,具体取决于您使用的语言。 /([^\/]*$/
    • @rasjani:如果你能像我写的那样使用正则表达式,这取决于语言。一些语言有正则表达式的语法文字(如 Perl 的 /…/),另一些语言有从字符串构建的类(如 Java),而其他语言只使用字符串(如 PHP)。但总的来说我的正则表达式是正确的。
    • 这也将匹配“/”,这意味着您的组将为空,即空 ID。如果您不希望这样做,请考虑 /([^/]+)$。
    • 感谢 Gumbo,这对我也有很大帮助。在 php 中有很多不同的处理方式。
    【解决方案3】:

    您还可以使用basename 函数获取“文件名”或最后一部分。

    <?php
    $url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';
    
    echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"
    

    在我的盒子上,我可以传递完整的 URL。您可能需要从前面去掉http:/

    Basename 和 dirname 非常适合在任何看起来像 unix 文件路径的地方移动。

    【讨论】:

      【解决方案4】:
      /^.*\/(.*)$/
      

      ^ = 行首

      .*\/ = 贪婪匹配到/从行首的最后一次出现

      (.*) = 最后一次出现 / 之后的所有内容的组

      【讨论】:

        【解决方案5】:

        你也可以正常的字符串拆分

        $str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
        $s = explode("/",$str);
        print end($s);
        

        【讨论】:

          【解决方案6】:

          此模式不会捕获$0 中的最后一个斜杠,如果最后一个斜杠后面没有字符,它将不匹配任何内容。

          /(?<=\/)([^\/]+)$/
          

          编辑:但它需要后视,ECMAScript(Javascript、Actionscript)、Ruby 或a few other flavors 不支持。如果您使用其中一种口味,则可以使用:

          /\/([^\/]+)$/
          

          但它捕获$0中的最后一个斜线。

          【讨论】:

          • ruby19 具有后向支持
          【解决方案7】:

          不是 PHP 程序员,但strrpos 似乎是一个更有希望的起点。找到最右边的“/”,然后找到您要查找的所有内容。没有使用正则表达式。

          查找字符串中字符最后出现的位置

          【讨论】:

          • 我正在考虑这样做,但新的 preg_match 可以做到。我确信有比我最终做事的方式更好的方式来做事。
          【解决方案8】:

          基于@Mark Rushakoff的回答不同情况的最佳解决方案:

          <?php
          $path = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123?var1&var2#hash";
          $vars =strrchr($path, "?"); // ?asd=qwe&stuff#hash
          var_dump(preg_replace('/'. preg_quote($vars, '/') . '$/', '', basename($path))); // test.png
          ?>
          
          1. Regular Expression to collect everything after the last /
          2. How to get file name from full path with PHP?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-29
            • 2018-06-26
            • 1970-01-01
            相关资源
            最近更新 更多