正则expression式收集最后/

我是新来的正则expression式,并想知道如何在最后一个之后收集所有东西。

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

我的例子string是

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

ID为: p1f3JYcCu_cb0i0JYuCu123

哦,我正在使用PHP。

这至less匹配(不是斜线)和string结尾之一:

 [^/]+$ 

笔记:

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

但是, 很可能更快更简单的解决scheme就是使用您的语言内置的string列表处理function – 即ListLast( Text , '/' )或等效函数。

对于PHP,最接近的函数是strrchr ,它的工作原理是这样的:

 strrchr( Text , '/' ) 

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

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

通常:

 /([^/]*)$ 

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


编辑由于你使用PHP,你也可以使用strrchr来返回从string最后一次出现到结束的所有内容。 或者你可以使用strrpossubstr的组合,首先find最后一次发生的位置,然后从该位置得到子string直到结束。 或explodearray_pop ,分割string在/和只是最后一部分。

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

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

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

基本名称和dirname非常适合移动看起来像unix文件path的任何内容。

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

^ =行的开始

.*\/ =贪婪匹配到最后一行到/从行的开始

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

你也可以正常的string拆分

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

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

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

编辑:但它需要向后看,不支持ECMAScript(Javascript,Actionscript),Ruby或一些其他口味 。 如果您正在使用其中一种口味,则可以使用:

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

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

不是一个PHP程序员,但strrpos似乎是一个更有前途的开始。 find最右边的“/”,过去的一切都是你正在寻找的。 没有使用正则expression式。

查找string中最后一个字符的位置

基于@ Mark Rushakoff的回答,为不同情况提供了最佳解决scheme:

 <?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. 正则expression式收集最后/
  2. 如何从PHP的完整path获取文件名?