Отримати символи після останнього / у URL-адресі


Відповіді:


264

Дуже просто:

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

strrpos отримує позицію останнього виникнення косої риси; substr повертає все після цієї позиції.


Як зазначає redanimalwar, якщо немає косої риси, це не працює правильно, оскільки strrposповертає false. Ось більш надійна версія:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);

Це скорочення першого символу, якщо зовсім немає косої риски.
redanimalwar

@redanimalwar Я додав ще одне рішення
DisgruntledGoat

8
Мені цікаво, чому $str = basename($url)це не отримує більше результатів, працює для мене ідеально.
redanimalwar

1
Базове ім'я @redanimalwar (1) призначене для файлових шляхів, а не для URL-адрес - я вважаю, що це завжди буде повертати той самий результат, але можуть бути крайні випадки, такі як зворотні косої риси; (2) basename працює лише для косої риски, тоді як моя відповідь може бути легко змінена, якщо хтось інший хоче зробити те ж саме з іншим символом.
НезадоволенняЗакрито

Дякую. Простий і практичний !!
Родріго Зулуага

50
$str = basename($url);

1
Чи працює це над URL-адресами? Чи не призначено базове ім'я для шляхів до файлів?
random_user_name

2
Здається, працює добре, це струнна функція; він не перевіряє, чи існує шлях.
Гіффорд Н.

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завжди здається мені більше накладним, хоча я ніколи не приурочував це, щоб побачити, як це швидко.
НезадоволенняGoat

Здається, вибух () трохи повільніше. У 10-ти примірниках - це кількість часу, яке потрібно для обох. substr () перший: 0,013657 / 0,045038
Сампсон

Можливо, буде повільніше, але я вважаю за краще тут вибух. Зокрема, якщо URL-адреса не містить жодного "/", відповідь "+1" у відповіді strrpos змушує пошкодження вибуху безладу.
Ноам

1
Приклад наводить повідомлення, і його, безумовно, слід переробити.
Ксатенев

Так,
вибухові

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);

3
моя версія, хоча кінцевий результат такий же, як опублікований, дозволяє OP використовувати інші елементи розбитого рядка, якщо він хотів.
ghostdog74

це правильна відповідь, оскільки заголовок запитує після "останнього" / у URL
Fabiano Shark

1

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


в 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)));

@redburn, використовуючи end()цей спосіб у php 5.4 і новіших версіях, ви передасте повідомлення. Згідно з документами: " Ви повинні передавати йому реальну змінну, а не функцію, що повертає масив, тому що за посиланням можуть передаватися лише фактичні змінні. "
billynoah

-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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.