如何使用PCRE获取最后一段网址?

时间:2012-01-19 13:41:33

标签: php pcre

我有一个网址, - “http://example.com/sales/view/id/705”,我需要获得最后一段(705)。

如何使用PCRE执行此操作?

8 个答案:

答案 0 :(得分:6)

这应该在Perl中执行:

my ($last) = $url =~ /([^\/]+)\z/;

但我宁愿使用URI模块:

my $last = (URI->new($url)->path_segments)[-1];

答案 1 :(得分:4)

(在PHP中)我不会将PCRE用于这样一个微不足道且毫不含糊的工作。我会这样做:

$parts = explode('/', rtrim($url, '/'));
$partYouWant = array_pop($parts);

修改

如果你需要使用PCRE(虽然我不知道你为什么会这样做),这个eugene y答案的变化会这样做:

$pattern = '#/([^/]+)\z#';
$url = 'http://example.com/sales/view/id/705';
preg_match($pattern, $url, $matches);
echo $matches[1];

答案 2 :(得分:4)

在PHP中,您可以使用单行代码执行此操作:

$url = 'http://example.com/sales/view/id/705';
substr($url, strrpos($url, '/') + 1);

答案 3 :(得分:2)

非PCRE替代方案:

$url="http://example.com/sales/view/id/705";
$lastPart = current(array_reverse((explode('/',parse_url($url,PHP_URL_PATH)))));

怀疑它是否更快

答案 4 :(得分:2)

您可以将此模式([^\/]*)$用于从上一个/到结束的所有内容。

也许也很有趣:([^\/\?]*)(\?.*)?$为您提供最后/和第一?

之间的所有内容

答案 5 :(得分:1)

如果可以的话,对PCRE说不,: - )。

echo basename('http://example.com/sales/view/id/705');

答案 6 :(得分:1)

最简单的:

  $ok=preg_match('#\d+$#',$url,$m);
  if($ok)
    echo $m[0],"\n";

聪明:

  $ok=preg_match('#/(\d+)$#',$url,$m);
  if($ok)
    echo $m[1],"\n";

灵活:(因为它还允许使用除数字之外的单词)

  $ok=preg_match('#/(\w+)$#',$url,$m);
  if($ok)
    echo $m[1],"\n";

更灵活:(因为它现在允许所有不匹配的东西)

  $ok=preg_match('#/(.*?)$#',$url,$m);
  if($ok)
    echo $m[1],"\n";

答案 7 :(得分:1)

preg_match('@/([1-9]\d*)/?(?:$|\?)@', $url, $matches);//$matches[1] contains your id