Obtener caracteres después del último / en la URL

Respuestas:

265

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 lo menciona redanimalwar, si no hay una barra, esto no funciona correctamente ya que strrposdevuelve falso. Aquí hay una versión más robusta:

$pos = strrpos($url, '/');
$id = $pos === false ? $url : substr($url, $pos + 1);
Cabra descontenta
fuente
Esto corta el primer carácter si no hay ninguna barra.
redanimalwar
@redanimalwar Agregué otra solución
DisgruntledGoat
9
Me pregunto por qué $str = basename($url)no está recibiendo más votos a favor, funciona perfectamente bien para mí.
redanimalwar
2
@redanimalwar (1) basename está destinado a rutas de archivo, no a URL; creo que siempre devolverá el mismo resultado, pero puede haber casos extremos como barras invertidas; (2) el nombre de base solo funciona para barras, mientras que mi respuesta se puede modificar fácilmente si alguien más quiere hacer lo mismo con un carácter diferente.
DisgruntledGoat
Gracias. Simple y practico !!
Rodrigo Zuluaga
51
$str = basename($url);
GZipp
fuente
1
¿Funciona esto en las URL? ¿No es el nombre de base destinado a las rutas de archivo?
random_user_name
2
Parece funcionar bien, es una función de cadena; no comprueba si existe la ruta.
Gifford N.
14

Puede explotar basándose en "/" y devolver la última entrada:

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

Eso se basa en soplar la cuerda, algo que no es necesario si sabes que el patrón de la cuerda en sí no cambiará pronto. Alternativamente, podría usar una expresión regular para ubicar ese valor al final de la cadena:

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

if ( preg_match( "/\d+$/", $url, $matches ) ) {
    print $matches[0];
}
Sampson
fuente
explodesiempre me parece más alto, aunque nunca lo he cronometrado para ver qué tan rápido es.
DisgruntledGoat
Parece que explotar () es un poco más lento. En 10k instancias, esta es la cantidad de tiempo necesaria para ambos. substr () primero: 0.013657 / 0.045038
Sampson
Podría ser más lento, pero prefiero explotar aquí. Específicamente, si la URL no contiene ningún "/", el +1 en la respuesta strrpos hace que explote un desastre que pueda superar.
Noam
1
El ejemplo arroja un aviso y definitivamente debería ser reelaborado.
Xatenev
Sí, los datos
ampliados
11

Puede utilizar substry strrchr:

$url = 'http://www.vimeo.com/1234567';
$str = substr(strrchr($url, '/'), 1);
echo $str;      // Output: 1234567
Gabriel
fuente
Más como esto: ltrim (strrchr ($ url, "/"), "/"); strchr devuelve una cadena, no un número
Denis Chenu
8
$str = "http://www.vimeo.com/1234567";
$s = explode("/",$str);
print end($s);
ghostdog74
fuente
3
mi versión, aunque el resultado final es el mismo que el publicado, permite a OP usar los otros elementos de la cadena dividida si así lo desea.
ghostdog74
esta es la respuesta correcta, ya que el título pregunta después de 'último' / en url
Fabiano Shark
1

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

nikc.org
fuente
en php7 devoluciones: PHP Notice: Only variables should be passed by reference.
billynoah
0

Dos líneas simples: sospecho que la primera es más rápida, pero la segunda es más bonita y diferente , end()y array_pop()puede pasar el resultado de una función directamente a current()sin generar ningún aviso o advertencia, ya que no mueve el puntero ni altera 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)));
Billynoah
fuente
@redburn, el uso de end()esta forma en php 5.4+ y versiones posteriores arrojará un aviso. De acuerdo con los documentos: " debes pasarle una variable real y no una función que devuelva una matriz porque solo las variables reales pueden pasarse por referencia ".
Billynoah
-1

Aquí hay 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;
}
Mahmoud Zalt
fuente