【发布时间】:2009-07-19 18:45:22
【问题描述】:
我是正则表达式的新手,想知道如何使用一个短语来收集最后一个 / 之后的所有内容。
我正在提取 Google 的 GData 使用的 ID。
我的示例字符串是
http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123
ID 在哪里:p1f3JYcCu_cb0i0JYuCu123
哦,我正在使用 PHP。
【问题讨论】:
我是正则表达式的新手,想知道如何使用一个短语来收集最后一个 / 之后的所有内容。
我正在提取 Google 的 GData 使用的 ID。
我的示例字符串是
http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123
ID 在哪里:p1f3JYcCu_cb0i0JYuCu123
哦,我正在使用 PHP。
【问题讨论】:
这匹配至少一个(任何不是斜杠),后跟字符串结尾:
[^/]+$
备注:
+(而不是*),因此如果最后一个字符是斜线,则无法匹配(而不是匹配空字符串)。
但是,最有可能更快更简单的解决方案是使用您的语言的内置字符串列表处理功能 - 即 ListLast( Text , '/' ) 或等效函数。
对于 PHP,最接近的函数是 strrchr,其工作原理如下:
strrchr( Text , '/' )
这包括结果中的斜线 - 根据下面 Teddy 的评论,您可以使用 substr 删除斜线:
substr( strrchr( Text, '/' ), 1 );
【讨论】:
substr( strrchr( Text, '/' ), 1 );
【讨论】:
/([^\/]*$/
/…/),另一些语言有从字符串构建的类(如 Java),而其他语言只使用字符串(如 PHP)。但总的来说我的正则表达式是正确的。
/^.*\/(.*)$/
^ = 行首
.*\/ = 贪婪匹配到/从行首的最后一次出现
(.*) = 最后一次出现 / 之后的所有内容的组
【讨论】:
你也可以正常的字符串拆分
$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
【讨论】:
此模式不会捕获$0 中的最后一个斜杠,如果最后一个斜杠后面没有字符,它将不匹配任何内容。
/(?<=\/)([^\/]+)$/
编辑:但它需要后视,ECMAScript(Javascript、Actionscript)、Ruby 或a few other flavors 不支持。如果您使用其中一种口味,则可以使用:
/\/([^\/]+)$/
但它会捕获$0中的最后一个斜线。
【讨论】:
不是 PHP 程序员,但strrpos 似乎是一个更有希望的起点。找到最右边的“/”,然后找到您要查找的所有内容。没有使用正则表达式。
查找字符串中字符最后出现的位置
【讨论】:
基于@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
?>
【讨论】: