2010-07-26 29 views
11

Tengo dos cadenas ejemplo de nombre de archivo:Regex: cómo hacer coincidir el último punto en una cadena

jquery.ui.min.js 
jquery.ui.min.css 

Qué expresiones regulares puedo usar para solo el punto pasado? No necesito nada más, solo el punto final.

Un poco más sobre lo que estoy haciendo. Estoy usando la función preg_split() de PHP para dividir el nombre de archivo en una matriz. La función borra cualquier coincidencia y le proporciona una matriz con los elementos entre divisiones. Estoy tratando de conseguir que dividir jquery.ui.min.js en una matriz que tiene este aspecto:

array[0] = jquery.ui.min 
array[1] = js 
+0

a juego del último punto no es difícil, él se puede dar como resultado '.'. ¿Quiere decir "todo después del último punto", es decir, "la extensión"? – deceze

+0

Solo quiero el último punto, y nada más. Me di cuenta de que coincidía con la extensión usando \ .. [^ \.] + $ Ahora necesito obtener el punto por sí mismo. –

Respuesta

11

Creo que tendrá dificultades para usar preg_split, preg_match debería ser la mejor opción.

preg_match('/(.*)\.([^.]*)$/', $filename, $matches); 

Como alternativa, echa un vistazo a pathinfo.
O, lo hacen de manera muy sencilla en dos líneas:

$filename = substr($file, 0, strrpos($file, '.')); 
$extension = substr($file, strrpos($file, '.') + 1); 
+0

¡Genial! pathinfo() hace exactamente lo que necesitaba. ¡Gracias! –

+0

de acuerdo. No hay ninguna razón para que Regex necesite ser usado para esto. –

+1

Si bien no tiene ningún ejemplo en php.net, 'pathinfo' también funciona con url externos. Entonces 'pathinfo ('http://somehost.com/some/path/some.file')' también funciona. – RaphaelDDL

2
 
\.[^.]*$ 
8

Si usted está buscando para extraer la última parte de la cadena,' d necesidad:

\.([^.]*)$ 

si no quieren que la . o

(\.[^.]*)$ 

si lo hace.

+0

Justo lo que estaba buscando. Lo usé para agregar _small a una URL de archivo justo antes de la extensión de archivo (y cualquier parámetro después de ella). var prodImg = cartItem.image.replace (/(\.[^.]*)$/, "_small $ 1"); – Carson

4

A primera vista no hay ninguna razón para utilizar expresiones regulares para esto. Aquí hay 2 métodos diferentes que utilizan funciones optimizadas para el análisis de cadenas estáticas:

Opción 1:

$ext = "jquery.ui.min.css"; 
$ext = array_pop(explode('.',$ext)); 
echo $ext; 

Opción 2:

$ext = "jquery.ui.min.css"; 
$ext = pathinfo($ext); 
echo $ext['extension']; 
+0

pathinfo() parece ser la función más rápida para esta tarea. Regexp tomó 4.5, array_pop 4 y pathinfo() 3 unidades relativas de tiempo para realizar la tarea. – valentinas

0

He utilizado este - darle una oportunidad :

m/\.([^.\\]+)$/ 
0

Esto es lo que tenía que excluye el último punto cuando juego por sólo el último "parte":

[^\.]([^.]*)$ 
Cuestiones relacionadas