Pobierz znaki po ostatnim / w adresie URL

Odpowiedzi:

265

Po prostu:

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

strrpos pobiera pozycję ostatniego wystąpienia ukośnika; substr zwraca wszystko po tej pozycji.


Jak wspomniano w redanimalwar, jeśli nie ma ukośnika, nie działa to poprawnie, ponieważ strrposzwraca false. Oto bardziej solidna wersja:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);
Niezadowolony Kozioł
źródło
To wycina pierwszy znak, jeśli w ogóle nie ma ukośnika.
redanimalwar
@redanimalwar Dodałem kolejne rozwiązanie
DisgruntledGoat
9
Zastanawiam się, dlaczego $str = basename($url)nie dostaje więcej upvotes, działa dla mnie idealnie.
redanimalwar
2
@redanimalwar (1) basename jest przeznaczony dla ścieżek do plików, a nie adresów URL - myślę, że zawsze zwróci ten sam wynik, ale mogą wystąpić przypadki krawędzi, takie jak ukośniki odwrotne; (2) basename działa tylko dla ukośników, podczas gdy moją odpowiedź można łatwo zmodyfikować, jeśli ktoś inny chce zrobić to samo z inną postacią.
DisgruntledGoat
Dzięki. Proste i praktyczne !!
Rodrigo Zuluaga
51
$str = basename($url);
GZipp
źródło
1
Czy to działa na adresach URL? Czy basename nie jest przeznaczony dla ścieżek plików?
random_user_name
2
Wygląda na to, że działa dobrze, jest to funkcja ciągu; nie sprawdza, czy ścieżka istnieje.
Gifford N.
14

Możesz eksplodować na podstawie „/” i zwrócić ostatni wpis:

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

Polega to na rozerwaniu struny, co nie jest konieczne, jeśli wiesz, że sam wzór struny wkrótce się nie zmieni. Możesz alternatywnie użyć wyrażenia regularnego, aby zlokalizować tę wartość na końcu ciągu:

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

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}
Sampson
źródło
explodezawsze wydaje mi się bardziej nad głową, chociaż nigdy nie mierzyłem czasu, żeby zobaczyć, jak szybko jest.
DisgruntledGoat
Wydaje się, że eksplodowanie () jest nieco wolniejsze. W 10 000 instancjach jest to czas potrzebny na oba. substr () pierwszy: 0,013657 / 0,045038
Sampson
Może być wolniejszy, ale wolę eksplodować tutaj. W szczególności, jeśli adres URL nie zawiera żadnego „/”, +1 w odpowiedzi strrpos sprawia, że ​​bałagan jest w stanie przezwyciężyć.
Noam
1
Przykład rzuca ostrzeżenie i zdecydowanie należy go przerobić.
Xatenev
Tak, dane eksplodowane muszą być zmiennymi
ymakux
11

Możesz użyć substri strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567
Gabriel
źródło
Bardziej jak to: ltrim (strrchr ($ url, „/”), „/”); strchr zwraca ciąg, a nie liczbę
Denis Chenu
8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);
ghostdog74
źródło
3
moja wersja, mimo że wynik końcowy jest taki sam, jak opublikowany, pozwala OP na użycie innych elementów podzielonego ciągu, jeśli chce.
ghostdog74
to jest poprawna odpowiedź, ponieważ tytuł pyta po „ostatnim” / w adresie URL
Fabiano Shark
1

array_pop(explode("/", "http://vimeo.com/1234567")); zwróci ostatni element przykładowego adresu URL

nikc.org
źródło
w php7 zwroty: PHP Notice: Only variables should be passed by reference.
billynoah
0

Two one liners - podejrzewam, że pierwszy jest szybszy, ale drugi jest ładniejszy i niepodobny, end()i array_pop()możesz przekazać wynik funkcji bezpośrednio do current()bez generowania żadnego powiadomienia ani ostrzeżenia, ponieważ nie przesuwa wskaźnika ani nie zmienia tablicy.

$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
źródło
@redburn, użycie end()tego sposobu w php 5.4+ i nowszych spowoduje wyświetlenie powiadomienia. Według docs: „ musisz przekazać mu rzeczywistą zmienną, a nie funkcję zwracającą tablicę, ponieważ tylko rzeczywiste zmienne mogą być przekazywane przez odniesienie. ”.
billynoah
-1

Oto piękna dynamiczna funkcja, którą napisałem, aby usunąć ostatnią część adresu URL lub ścieżki.

/**
 * 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;
}
Mahmoud Zalt
źródło