2010-03-12 15 views
19

Cómo insertar "_thumb" en archivos que se generan dinámicamente.RegEx - Cómo insertar cadenas antes de la extensión de archivo

Por ejemplo, tengo un sitio que permite a los usuarios subir una imagen. El script toma la imagen, la optimiza y guarda en el archivo. ¿Cómo lo haría insertar la cadena "_thumb" para la imagen optimizada?

Actualmente estoy guardando 1 versión del archivo otpimized. CH-1268312613-foto.jpg

Quiero salvar el original como la cadena de arriba, pero quiero añadir, "_thumb" como la siguiente cadena CH-1268312613-photo_thumb.jpg

Respuesta

34

No hay necesidad de usar expresiones regulares. Esto lo hará:

$extension_pos = strrpos($filename, '.'); // find position of the last dot, so where the extension starts 
$thumb = substr($filename, 0, $extension_pos) . '_thumb' . substr($filename, $extension_pos); 
+5

no es para '.tar.gz' – Skyzer

3

¿Por qué te ¿Quieres usar un RegEx? ¿La extensión siempre es .jpg y solo hay una extensión? Tal vez puede reemplazarlo por _thumb.jpg?

Si no es tan simple, puede usar una función como pathinfo para extraer la extensión de nombre + y hacer un reemplazo allí. Que está trabajando sin una expresión regular, también, lo que podría ser una exageración aquí:

$info = pathinfo($file); 
$no_extension = basename($file, '.'.$info['extension']); 
echo $no_extension.'_thumb.'.$info['extension'] 
1
$str = "ch-1268312613-photo.jpg"; 
print preg_replace("/\.jpg$/i","_thumb.jpg",$str); 
1
preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg"); 

creo que el uso de una expresión regular es mucho más velocidad efectiva y realmente mejor para flexibilidad.

Pero admito solución de Chad es elegante y eficaz

+0

Hay un par de cosas mal con esto. No escapó del período en el patrón, por lo que coincidirá con cualquier carácter. Además, '\ w' no cubre todos los caracteres de nombre de archivo posibles. –

+0

Es cierto, porque no lo marqué como código por lo \. fue interpretado como. Y cierto de nuevo, pero el sistema de archivos tiene el derecho de usar cualquier char, apuesto que no – Darkyo

2

Suponiendo que sólo tiene la ocurrencia de ".jpg" una vez en la cadena, que puede hacer un str_replace en lugar de expresiones regulares

$filename = str_replace(".jpg", "_thumb.jpg", $filename); 

o incluso mejor, a substr_replace basta con insertar la cadena en un punto intermedio:

$filename = substr_replace($filename, '_thumb', -4, 0); 
9

en lugar de tomar la ruta de expresiones regulares (u otra porquería e manipulación de cadena) quizás algunas funciones relacionadas con el nombre de archivo sean más fáciles de usar: es decir, pathinfo (para obtener la extensión de archivo) y basename (para obtener el nombre de archivo menos la extensión).

$ext = pathinfo($filename, PATHINFO_EXTENSION); 
$thumb = basename($filename, ".$ext") . '_thumb.' . $ext; 

Edición: @tanascius pena por la respuesta muy similar, supongo que debería haber comprobado la pequeña ventana emergente, mientras que la redacción de este (que tomó un tiempo, me distraje).

Cuestiones relacionadas