2012-01-19 1 views
0

У меня есть URL, - «http://example.com/sales/view/id/705», и мне нужно получить последний сегмент (705).Как получить последний сегмент URL-адреса с помощью PCRE?

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

+0

использованием PCRE является одним из основных слов в моем вопросе. – NiLL

+0

'$ pattern = '~ http: //example.com/sales/view/id/ ([0-9] +) ~';' Можете ли вы подробнее рассказать о том, почему вам нужно решение pcre? Я не стану сомневаться в необходимости этого. Но ваш ответ может значительно изменить решение. –

+0

Мне нужно добавить ссылку utm (Analytics) для специальной ссылки для этого. Я использую preg_match с несколькими правилами. – NiLL

ответ

4

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

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

EDIT

Если вам нужно использовать PCRE (хотя я не знаю, почему вы) это вариация на ответ Eùgene Y был бы сделать это:

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

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

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

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

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

Ваше регулярное выражение может выйти из строя, если у URL-адреса есть запрос или фрагмент, который показывает, почему использование [URI] (http://search.cpan.org/perldoc?URI) - это умный способ. +1 для упоминания модуля. – ikegami

4

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

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

+1 - Я подозреваю, что это будет менее дорогостоящим, чем мое решение и будет работать одинаково. Для этого также может потребоваться 'rtrim ($ url, '/');' хотя я только ставил это в безопасную защиту от URL-адреса, потенциально имеющего завершающую косую черту, что может и не быть. – DaveRandom

+0

@DaveRandom Я думаю, что это тоже быстрее. Как вы заметили, это может не работать в случае «/» в конце строки, но, похоже, это не так. В любом случае кажется, что кому-то не нравится мое решение из-за -1 :) –

+3

У меня тоже есть, но что вы можете сделать. По крайней мере, это стоило реверсивной репутации вниз, а не объяснять. Я думаю, вы должны проиграть -5, если бросить первый downvote и не комментировать сообщение. – DaveRandom

2

Non PCRE альтернатива:

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

Сомнение, если это не быстрее, хотя

+0

Это здорово, но мне нужен PCRE ... – NiLL

1

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

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

Я не могу этого сделать = ( – NiLL

2

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

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

1

Простейшее:

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

Brainy:

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