正则表达式收集后的所有内容/

时间:2009-07-19 18:45:22

标签: php regex

我是正则表达式的新手,并想知道如何在最后/之后收集一个收集所有内容的词。

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

我的示例字符串是

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

ID为:p1f3JYcCu_cb0i0JYuCu123

哦,我正在使用PHP。

8 个答案:

答案 0 :(得分:102)

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

[^/]+$


注意:

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


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

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

strrchr( Text , '/' )

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

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

答案 1 :(得分:18)

一般而言:

/([^/]*)$

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


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

答案 2 :(得分:12)

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

<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"

在我的邮箱上,我可以传递完整的网址。你可能需要从前面剥离http:/

Basename和dirname非常适合浏览任何看起来像unix文件路径的内容。

答案 3 :(得分:8)

/^.*\/(.*)$/

^ =行的开头

.*\/ =与行开始的最后一次出现的贪婪匹配

(.*) =最后一次出现/

之后所有内容的组合

答案 4 :(得分:3)

你也可以正常字符串拆分

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

答案 5 :(得分:2)

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

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

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

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

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

答案 6 :(得分:1)

不是PHP程序员,但strrpos似乎是一个更有前途的开始。找到最右边的'/',过去的一切都是你想要的。没有使用正则表达式。

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

答案 7 :(得分:0)

基于@ 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?