2009-09-01 15 views
83

voglio ottenere i caratteri dopo l'ultimo/in un URL del tipo http://www.vimeo.com/1234567ottenere i caratteri dopo l'ultimo/a url

Come posso fare con PHP?

+0

Si potrebbe trovare [ 's ($ str) -> dopo Last ('/')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str .php # L445) utile, come trovato in [questa libreria autonoma] (https://github.com/delight-im/PHP-Str). – caw

risposta

182

Molto semplice:

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

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


Come menzionato da redanimalwar se non v'è alcuna barra questo non funziona correttamente in quanto strrpos restituisce false. Ecco una versione più robusta:

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

ooh great..it lavoro per me..grazie – deadman

+1

soluzione semplice e piacevole, grazie. –

+0

Questo taglio del primo carattere se non c'è nessuna barra. – redanimalwar

12

Si potrebbe explode sulla base di "/", e restituire l'ultima voce:

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

che si basa sulla soffia la stringa a parte, qualcosa che non è necessario se si conosce il modello della stringa presto non cambierà Si potrebbe, in alternativa, utilizzare un'espressione regolare per individuare tale valore alla fine della stringa:

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

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

'explode' mi sembra sempre più sopra di me, anche se non l'ho mai programmato per vedere quanto sia veloce. – DisgruntledGoat

+0

Sembra che explode() sia un po 'più lento. Nelle istanze 10k, questa è la quantità di tempo impiegata per entrambi. substr() first: 0,013657/0,045038 – Sampson

+0

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

1

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

+0

in php7 Avviso di resi: 'Avviso PHP: solo le variabili devono essere passate per riferimento'. – billynoah

5
$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

+0

questa è la risposta corretta, dal momento che il titolo chiede dopo "ultimo"/nell'url –

9

È possibile utilizzare substr e strrchr:

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

Più in questo modo: ltrim (strrchr ($ url, "/"), "/"); strchr restituisce una stringa, non un numero –

28
$str = basename($url); 
+1

Funziona su URL? Il basename non è destinato ai percorsi dei file? –

+1

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

-1

Ecco una bella 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; 
} 
0

due uno liners - ho il sospetto che il primo è più veloce, ma secondo è più bella e, a differenza end() e array_pop(), è possibile passare il risultato di una funzione direttamente al current() senza generare alcun preavviso o avvertimento dal momento che doesn' t spostare il puntatore o alterare la matrice.

$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))); 
Problemi correlati