正则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最后一次出现到结束的所有内容。 或者你可以使用strrpos
和substr
的组合,首先find最后一次发生的位置,然后从该位置得到子string直到结束。 或explode
和array_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 ?>
- 正则expression式收集最后/
- 如何从PHP的完整path获取文件名?