2009-09-01 10 views
83

Quiero llegar a los personajes después de la última/en una URL como http://www.vimeo.com/1234567Obtener caracteres después de la última/url en

¿Cómo lo hago con php?

+0

Usted puede encontrar [ 's ($ str) -> afterLast ('/')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str .php # L445) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

182

Muy simple:

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

strrpos obtiene la posición de la última aparición de la barra; substr devuelve todo después de esa posición.


Como se ha mencionado por redanimalwar si no hay barra esto no funciona correctamente, ya strrpos retornos falsos. Aquí hay una versión más robusta:

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

ooh genial ... es trabajo para mí ... gracias – deadman

+1

buena y sencilla solución, gracias. –

+0

Esto corta el primer caracter si no hay ninguna barra en absoluto. – redanimalwar

12

Usted podría explode basado en "/", y devolver la última entrada:

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

que se basa en que sopla la cadena de diferencia, algo que no es necesaria si se conoce el patrón de la cadena en sí mismo no cambiará pronto. Se podría, alternativamente, utilizar una expresión regular para localizar ese valor al final de la cadena:

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

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

'explotar' siempre me parece más elevado, aunque nunca lo he cronometrado para ver qué tan rápido es. – DisgruntledGoat

+0

Parece que explotar() es un poco más lento. En 10k instancias, esta es la cantidad de tiempo necesario para ambos. substr() primero: 0.013657/0.045038 – Sampson

+0

Puede ser más lento, pero prefiero la explosión aquí. Específicamente, si la url no contiene ningún "/", el +1 en la respuesta de strrpos hace que un desastre explote es capaz de vencer. – Noam

1

array_pop(explode("/", "http://vimeo.com/1234567")); devolverá el último elemento de la URL de ejemplo

+0

en php7 Aviso de devolución: 'Aviso de PHP: solo las variables deben pasarse por referencia'. – billynoah

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

mi versión, aunque el resultado final es el mismo que el publicado, permite a OP utilizar los otros elementos de la secuencia de división si así lo desea. – ghostdog74

+0

esta es la respuesta correcta, ya que el título pregunta después de 'último'/en url –

9

Puede utilizar substr y strrchr:

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

Más como esto: ltrim (strrchr ($ url, "/"), "/"); strchr devuelve una cadena, no un número –

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

¿Funciona esto en las URL? ¿El nombre base no está destinado a rutas de archivos? –

+1

Parece que funciona bien, es una función de cadena; no verifica si existe la ruta. –

-1

aquí es una hermosa función dinámica que escribí para eliminar la última parte de la url o ruta.

/** 
* 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

dos trazadores de líneas uno - Sospecho que el primero es más rápido, pero segundo es más bonita y, a diferencia end() y array_pop(), puede pasar el resultado de una función directamente a current() sin generar ningún aviso o advertencia, ya que doesn' Mueva el puntero o modifique la matriz.

$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))); 
Cuestiones relacionadas