Получить символы после последнего / в URL

Ответы:

265

Очень просто:

$id = substr($url, strrpos($url, '/') + 1);

strrpos получает позицию последнего появления косой черты; substr возвращает все, что находится после этой позиции.


Как упоминалось redanimalwar, если нет косой черты, это работает неправильно, так как strrposвозвращает false. Вот более надежная версия:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);
DisgruntledGoat
источник
Это обрезает первый символ, если косой черты нет вообще.
redanimalwar
@redanimalwar Я добавил еще одно решение
DisgruntledGoat 02
9
Мне интересно, почему $str = basename($url)не набирает больше голосов, у меня отлично работает.
redanimalwar
2
@redanimalwar (1) basename предназначено для путей к файлам, а не для URL-адресов - я думаю, что он всегда будет возвращать один и тот же результат, но могут быть крайние случаи, такие как обратная косая черта; (2) basename работает только для косых черт, тогда как мой ответ можно легко изменить, если кто-то другой хочет сделать то же самое с другим символом.
DisgruntledGoat
Спасибо. Просто и практично !!
Родриго Сулуага,
51
$str = basename($url);
GZipp
источник
1
Это работает с URL-адресами? Разве базовое имя не предназначено для путей к файлам?
random_user_name 05
2
Кажется, работает нормально, это строковая функция; он не проверяет, существует ли путь.
Gifford N.
14

Вы можете взорвать "/" и вернуть последнюю запись:

print end( explode( "/", "http://www.vimeo.com/1234567" ) );

Это основано на раздувании струны на части, в этом нет необходимости, если вы знаете, что образец самой струны не скоро изменится. В качестве альтернативы вы можете использовать регулярное выражение, чтобы найти это значение в конце строки:

$url = "http://www.vimeo.com/1234567";

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}
Сэмпсон
источник
explodeМне всегда кажется, что это слишком накладно, хотя я никогда не рассчитывал время, чтобы увидеть, насколько он быстр.
DisgruntledGoat 01
Похоже, что explode () работает немного медленнее. В 10k экземплярах это время, необходимое для обоих. substr () первый: 0,013657 / 0,045038
Сэмпсон,
Может быть и медленнее, но здесь я предпочитаю взрыв. В частности, если URL-адрес не содержит «/», +1 в ответе strrpos создает беспорядок, который можно преодолеть.
Ноам
1
Пример бросает уведомление и обязательно должен быть переработан.
Xatenev
Да, разнесенные данные должны быть переменной
ymakux
11

Вы можете использовать substrи strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567
Габриель
источник
Примерно так: ltrim (strrchr ($ url, "/"), "/"); strchr возвращает строку, а не число
Денис Чену
8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);
ghostdog74
источник
3
моя версия, хотя конечный результат такой же, как и опубликованный, позволяет OP использовать другие элементы разделенной строки, если он хочет.
ghostdog74 01
это правильный ответ, так как в заголовке указывается после «последнего» / в URL-
Фабиано Шарк
1

array_pop(explode("/", "http://vimeo.com/1234567")); вернет последний элемент URL-адреса примера

nikc.org
источник
в php7 Возвращения заметить: PHP Notice: Only variables should be passed by reference.
billynoah
0

Два одинарных лайнера - я подозреваю, что первый быстрее, но второй красивее и непохож, end()и array_pop()вы можете передать результат функции напрямую, current()не генерируя никаких уведомлений или предупреждений, поскольку он не перемещает указатель и не изменяет массив.

$var = 'http://www.vimeo.com/1234567';

// VERSION 1 - one liner simmilar to DisgruntledGoat's answer above
echo substr($a,(strrpos($var,'/') !== false ? strrpos($var,'/') + 1 : 0));

// VERSION 2 - explode, reverse the array, get the first index.
echo current(array_reverse(explode('/',$var)));
billynoah
источник
@redburn, при использовании end()этого способа в php 5.4+ и выше будет выведено уведомление. Согласно документации: « вы должны передать ему реальную переменную, а не функцию, возвращающую массив, потому что только фактические переменные могут передаваться по ссылке ».
Биллиноа,
-1

Вот красивая динамическая функция, которую я написал для удаления последней части URL-адреса или пути.

/**
 * remove the last directories
 *
 * @param $path the path
 * @param $level number of directories to remove
 *
 * @return string
 */
private function removeLastDir($path, $level)
{
    if(is_int($level) && $level > 0){
        $path = preg_replace('#\/[^/]*$#', '', $path);
        return $this->removeLastDir($path, (int) $level - 1);
    }
    return $path;
}
Махмуд Залт
источник