Expresión regular para recoger todo después de la última /

Soy nuevo en expresiones regulares y me pregunto cómo redactar uno que recopile todo después del último / .

Estoy extrayendo una ID utilizada por Google GData.

mi cadena de ejemplo es

 http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123 

Donde el ID es: p1f3JYcCu_cb0i0JYuCu123

Ah, y estoy usando PHP.

Esto coincide con al menos uno de (cualquier cosa que no sea una barra inclinada) seguido del final de la cadena:

 [^/]+$ 

Notas:

  • Sin parens porque no necesita ningún grupo – el resultado va al grupo 0 (el partido mismo).
  • Utiliza + (en lugar de * ) para que si el último carácter es una barra no coincida (en lugar de hacer coincidir la cadena vacía).

Pero, lo más probable es que una solución más rápida y sencilla sea ​​utilizar la funcionalidad de procesamiento de listas de cadenas incorporada en su idioma, es decir, ListLast( Text , '/' ) o una función equivalente.

Para PHP, la función más cercana es strrchr que funciona así:

 strrchr( Text , '/' ) 

Esto incluye la barra en los resultados: según el comentario de Teddy a continuación, puede eliminar la barra con substr :

 substr( strrchr( Text, '/' ), 1 ); 

En general:

 /([^/]*)$ 

La información que desea sería entonces la coincidencia del primer grupo.


Editar Dado que estás usando PHP, también strrchr usar strrchr que devuelve todo desde la última ocurrencia de un personaje en una cadena hasta el final. O puede usar una combinación de strrpos y substr , primero encuentre la posición de la última ocurrencia y luego obtenga la subcadena desde esa posición hasta el final. O explode y array_pop , divida la cadena en / y obtenga solo la última parte.

También puede obtener el “nombre de archivo”, o la última parte, con la función de nombre base .

 < ?php $url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123'; echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123" 

En mi casilla, podría pasar la URL completa. Es posible que deba despojarse de http:/ desde el frente.

Basename y dirname son geniales para moverse a través de cualquier elemento que se parezca a un archivo de ruta de acceso unix.

 /^.*\/(.*)$/ 

^ = comienzo de la fila

.*\/ = concordancia ambiciosa con la última ocurrencia a / desde el inicio de la fila

(.*) = grupo de todo lo que viene después de la última ocurrencia de /

también puedes dividir las cuerdas normales

 $str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123"; $s = explode("/",$str); print end($s); 

Este patrón no capturará la última barra en $0 , y no coincidirá con nada si no hay caracteres después de la última barra.

 /(?< =\/)([^\/]+)$/ 

Editar: pero requiere mirar hacia atrás, no compatible con ECMAScript (Javascript, Actionscript), Ruby o algunos otros sabores . Si está usando uno de esos sabores, puede usar:

 /\/([^\/]+)$/ 

Pero capturará la última barra en $0 .

No es un progtwigdor PHP, pero strrpos parece ser un lugar más prometedor para comenzar. Encuentra el ‘/’ más a la derecha, y todo lo anterior es lo que estás buscando. No se usa regex

Encontrar la posición de la última ocurrencia de un char en una cadena

Basado en la respuesta de @ Mark Rushakoff la mejor solución para diferentes casos:

 < ?php $path = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123?var1&var2#hash"; $vars =strrchr($path, "?"); // ?asd=qwe&stuff#hash var_dump(preg_replace('/'. preg_quote($vars, '/') . '$/', '', basename($path))); // test.png ?> 
  1. Expresión regular para recoger todo después de la última /
  2. ¿Cómo obtener el nombre de archivo de la ruta completa con PHP?