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

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

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

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

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

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


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

@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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.