У меня есть URL, - «http://example.com/sales/view/id/705
», и мне нужно получить последний сегмент (705).Как получить последний сегмент URL-адреса с помощью PCRE?
Как это сделать с помощью PCRE?
У меня есть URL, - «http://example.com/sales/view/id/705
», и мне нужно получить последний сегмент (705).Как получить последний сегмент URL-адреса с помощью PCRE?
Как это сделать с помощью PCRE?
(в 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];
Это должно сделать это в Perl:
my ($last) = $url =~ /([^\/]+)\z/;
Но я предпочел бы использовать URI
модуль:
my $last = (URI->new($url)->path_segments)[-1];
Ваше регулярное выражение может выйти из строя, если у URL-адреса есть запрос или фрагмент, который показывает, почему использование [URI] (http://search.cpan.org/perldoc?URI) - это умный способ. +1 для упоминания модуля. – ikegami
в PHP вы можете сделать это в одной строки кода:
$url = 'http://example.com/sales/view/id/705';
substr($url, strrpos($url, '/') + 1);
+1 - Я подозреваю, что это будет менее дорогостоящим, чем мое решение и будет работать одинаково. Для этого также может потребоваться 'rtrim ($ url, '/');' хотя я только ставил это в безопасную защиту от URL-адреса, потенциально имеющего завершающую косую черту, что может и не быть. – DaveRandom
@DaveRandom Я думаю, что это тоже быстрее. Как вы заметили, это может не работать в случае «/» в конце строки, но, похоже, это не так. В любом случае кажется, что кому-то не нравится мое решение из-за -1 :) –
У меня тоже есть, но что вы можете сделать. По крайней мере, это стоило реверсивной репутации вниз, а не объяснять. Я думаю, вы должны проиграть -5, если бросить первый downvote и не комментировать сообщение. – DaveRandom
Non PCRE альтернатива:
$url="http://example.com/sales/view/id/705";
$lastPart = current(array_reverse((explode('/',parse_url($url,PHP_URL_PATH)))));
Сомнение, если это не быстрее, хотя
Это здорово, но мне нужен PCRE ... – NiLL
Скажи нет PCRE, если вы можете, :-).
echo basename('http://example.com/sales/view/id/705');
Я не могу этого сделать = ( – NiLL
Вы можете использовать этот шаблон ([^\/]*)$
для всего, от последнего /
до конца.
Может быть также интересно: ([^\/\?]*)(\?.*)?$
дает вам все, что между последней /
и первым ?
Простейшее:
$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";
preg_match('@/([1-9]\d*)/?(?:$|\?)@', $url, $matches);//$matches[1] contains your id
использованием PCRE является одним из основных слов в моем вопросе. – NiLL
'$ pattern = '~ http: //example.com/sales/view/id/ ([0-9] +) ~';' Можете ли вы подробнее рассказать о том, почему вам нужно решение pcre? Я не стану сомневаться в необходимости этого. Но ваш ответ может значительно изменить решение. –
Мне нужно добавить ссылку utm (Analytics) для специальной ссылки для этого. Я использую preg_match с несколькими правилами. – NiLL