Как получить последний сегмент URL с помощью PCRE? - PullRequest
0 голосов
/ 19 января 2012

У меня есть URL, - "http://example.com/sales/view/id/705", и мне нужно получить последний сегмент (705).

Как я могу сделать это с помощью PCRE?

Ответы [ 8 ]

6 голосов
/ 19 января 2012

Это должно сделать это в Perl:

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

Но я бы предпочел использовать модуль URI:

my $last = (URI->new($url)->path_segments)[-1];
4 голосов
/ 19 января 2012

В PHP вы можете сделать это в одной строке кода:

$url = 'http://example.com/sales/view/id/705';
substr($url, strrpos($url, '/') + 1);
4 голосов
/ 19 января 2012

(в PHP) Я бы не использовал PCRE для такой тривиальной и однозначной работы. Я бы просто сделал:

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

EDIT

Если вам нужно использовать PCRE (хотя я не знаю, почему вы это сделаете), этот вариант ответа Евгения У сделает это:

$pattern = '#/([^/]+)\z#';
$url = 'http://example.com/sales/view/id/705';
preg_match($pattern, $url, $matches);
echo $matches[1];
2 голосов
/ 19 января 2012

Вы можете использовать этот шаблон ([^\/]*)$ для всего от последнего / до конца.

Может быть также интересно: ([^\/\?]*)(\?.*)?$ дает вам все между последним / и первым ?

2 голосов
/ 19 января 2012

Альтернатива без PCRE:

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

Сомневаюсь, что это быстрее, хотя

1 голос
/ 21 января 2012
preg_match('@/([1-9]\d*)/?(?:$|\?)@', $url, $matches);//$matches[1] contains your id
1 голос
/ 19 января 2012

Простейший:

  $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";
1 голос
/ 19 января 2012

Скажи нет PCRE, если сможешь: -).

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