Ottieni caratteri dopo l'ultimo / nell'URL


Risposte:


265

Molto semplicemente:

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

strrpos ottiene la posizione dell'ultima occorrenza della barra; substr restituisce tutto dopo quella posizione.


Come accennato da redanimalwar, se non c'è barra non funziona correttamente poiché strrposrestituisce false. Ecco una versione più robusta:

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

Questo taglia il primo carattere se non c'è affatto barra.
redanimalwar

@redanimalwar ho aggiunto un'altra soluzione
DisgruntledGoat

9
Mi chiedo perché $str = basename($url)non sta ottenendo più voti positivi, funziona perfettamente bene per me.
redanimalwar

2
@redanimalwar (1) basename è inteso per i percorsi dei file, non per gli URL - penso che restituirà sempre lo stesso risultato ma potrebbero esserci casi limite come i backslash; (2) basename funziona solo per le barre mentre la mia risposta può essere facilmente modificata se qualcun altro vuole fare la stessa cosa con un carattere diverso.
Capra scontenta

Grazie. Semplice e pratico !!
Rodrigo Zuluaga il

51
$str = basename($url);

1
Funziona con gli URL? Il nome base non è destinato ai percorsi dei file?
random_user_name

2
Sembra funzionare bene, è una funzione stringa; non controlla se il percorso esiste.
Gifford N.

14

Potresti esplodere in base a "/" e restituire l'ultima voce:

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

Questo si basa sul far saltare la corda, qualcosa che non è necessario se sai che lo schema della corda stessa non cambierà presto. In alternativa, puoi utilizzare un'espressione regolare per individuare quel valore alla fine della stringa:

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

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}

explodeMi sembra sempre più sovraccarico, anche se non l'ho mai cronometrato per vedere quanto è veloce.
Capra scontenta

Sembra che explode () sia un po 'più lento. Su 10.000 istanze, questo è il tempo impiegato per entrambi. substr () first: 0,013657 / 0,045038
Sampson

Potrebbe essere più lento, ma preferisco l'esplosione qui. In particolare se l'url non contiene alcuna "/" il +1 nella risposta strrpos fa esplodere un pasticcio è in grado di superare.
Noam

1
L'esempio genera un avviso e dovrebbe essere rielaborato definitivamente.
Xatenev

Sì, i dati esplosi devono essere una variabile
ymakux

11

Puoi usare substre strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567

Più come questo: ltrim (strrchr ($ url, "/"), "/"); strchr restituisce una stringa, non un numero
Denis Chenu

8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);

3
la mia versione, sebbene il risultato finale sia lo stesso di quello pubblicato, consente a OP di utilizzare gli altri elementi della stringa divisa se lo desidera.
ghostdog74

questa è la risposta corretta, poiché il titolo chiede dopo 'last' / nell'url
Fabiano Shark

1

array_pop(explode("/", "http://vimeo.com/1234567")); restituirà l'ultimo elemento dell'URL di esempio


in php7 ritorni di preavviso: PHP Notice: Only variables should be passed by reference.
billynoah

0

Due linee: sospetto che la prima sia più veloce ma la seconda è più carina e diversa end()e array_pop()puoi passare il risultato di una funzione direttamente a current()senza generare alcun avviso o avviso poiché non sposta il puntatore o altera l'array.

$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, l'utilizzo di end()questo metodo in php 5.4+ e versioni successive genererà un avviso. Secondo la documentazione: " è necessario passare una variabile reale e non una funzione che restituisce un array perché solo le variabili effettive possono essere passate per riferimento. ".
billynoah

-1

Ecco una bellissima funzione dinamica che ho scritto per rimuovere l'ultima parte dell'URL o del percorso.

/**
 * 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.