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

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

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];
}

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

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

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


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

@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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.