2009-07-19 13 views
42

Soy nuevo en expresiones regulares y me pregunto cómo redactar uno que recopile todo después de la última /.Expresión regular para recopilar todo después de la última/

Estoy extrayendo una ID utilizada por Google GData.

mi cadena ejemplo es

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

caso de que el ID es: p1f3JYcCu_cb0i0JYuCu123

Ah, y estoy usando PHP.

+2

¿Qué idioma usas? – Gumbo

Respuesta

82

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

[^/]+$ 


Notas:

  • No parens, ya que no necesita ningún grupo - resultado entra en el grupo 0 (el partido en sí).
  • Utiliza + (en lugar de *) de modo que si el último carácter es una barra diagonal, no coincide (en lugar de hacer coincidir la cadena vacía).


Pero, más probable una solución más rápida y sencilla es utilizar la funcionalidad de procesamiento del lenguaje incorporado en lista de cadenas - es decir, ListLast(Text , '/') o equivalente función.

Para PHP, la función más cercano es strrchr que funciona de esta manera:

strrchr(Text , '/') 

Esto incluye la barra en los resultados - de acuerdo con el comentario de peluche a continuación, puede quitar la barra con substr:

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

+1 para usar una solución no regex. Subencadenando la URL sería más rápido y evitaría importar soporte de expresiones regulares. –

+0

De hecho, sospecho que la mayoría de las funciones para esto funcionarían al revés desde el final, y así evitaría comprobar la mayoría de los caracteres. aik todos los motores regex trabajan hacia adelante, por lo que tendrían que verificar cada personaje. –

+1

Gracias por la ayuda increíble, sé que tengo una mejor comprensión de la expresión regular. El código PHP se ve así. preg_match ('([^ /] + $)', "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu124 ", $ coincidencias) – Hellonearthis

17

general:

/([^/]*)$ 

los datos que desea sería entonces el partido del primer grupo.


Editar Puesto que usted está usando PHP, también se puede utilizar strrchr que está volviendo todo, desde la última ocurrencia de un carácter 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.

+0

de alguna manera que no parece funcionar en uno? – rasjani

+3

es posible que necesite escapar de la barra en la clase de caracteres, según el idioma que esté utilizando. '/ ([^ \ /] * $ /' – rampion

+0

@rasjani: depende del idioma si puede usar esa expresión regular como la escribí. Algunos lenguajes tienen un literal de sintaxis para expresiones regulares (como '/ ... /' de Perl)), otros tienen clases para construir uno a partir de una cadena (como Java) y otros simplemente usan cadenas (como PHP). Pero en general mi expresión regular es correcta. – Gumbo

2

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 de búsqueda hacia atrás, no es compatible con ECMAScript (JavaScript, ActionScript), Ruby o a few other flavors. Si está utilizando uno de esos sabores, puede utilizar:

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

Pero va a capturar la última barra en $0.

+0

ruby19 has lookbehind support – rampion

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

^ = inicio de la fila

.*\/ = codiciosos partido a la última ocurrencia a/desde el inicio de la fila

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

1

No es un programador de 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

posición Búsqueda de la última aparición de un caracter en una cadena

+0

Estaba pensando en hacer eso, pero nuevo preg_match podría hacerlo. Estoy seguro de que hay mejores formas de hacer las cosas, que las formas en que termino haciéndolo. – Hellonearthis

11

También puede obtener el "nombre de archivo", o la última parte, con la función basename.

<?php 
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123'; 

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123" 

En mi cuadro, podría simplemente pasar la URL completa. Es posible que necesite quitarse http:/ desde el frente.

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

3

También puede hacer cadena normal de dividir

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