2010-03-07 8 views
97

Estoy buscando una pequeña función que me permita eliminar la extensión de un nombre de archivo.Cómo eliminar la extensión de la cadena (¡solo la extensión real!)

He encontrado muchos ejemplos en Google, pero son malos, porque simplemente eliminan parte de la cadena con "." . Usan punto para el limitador y solo cortan la cuerda.

mirada a estos scripts,

$from = preg_replace('/\.[^.]+$/','',$from); 

o

$from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.')))); 

Cuando añadimos la cadena como esta:

This.is ejemplo de someString

Devolverá solo "Esto" ...

La extensión puede tener 3 o 4 caracteres, por lo que debemos verificar si el punto está en la posición 4 o 5, y luego eliminarlo.

¿Cómo se puede hacer?

+1

¿Qué es una extensión "real"? ¿Desea eliminar los últimos 4 caracteres o caracteres si están precedidos por un punto? – clyfe

+0

"Col. Shrapnel": está diseñado para usuarios de Windows. "clyfe" - sí, quiero eliminar todo después del punto, pero solo si está en la posición 4 o 5, lo que representará ".jpeg" o ".mp3". Simplemente no lo quito. Sé que puedo hacerlo manualmente usando str-pos y cortar cadena usando if declaración (si 5 pos = punto luego corta (rtrim) desde 5 caracteres, si 4 pos = punto luego rtrim 4, de lo contrario regresa sin ninguna modificación . Pero tal vez es la solución más rápida. – marc

+1

¿Qué pasa con los archivos .package? o .unity? parece un poco arbitraria para restringir una extensión de 4 caracteres. – rdb

Respuesta

137

prueba este:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename); 

lo tanto, esto coincide con un punto seguido de tres o cuatro caracteres que no son un punto o un espacio. La regla de "3 o 4" probablemente debería relajarse, ya que hay muchas extensiones de archivo que son más cortas o más largas.

+0

TH! El problema es que también hay personas que renombran archivos como: '20120720.something.somethingelse.jpg' –

+3

¡No creo que esto funcione con archivos con dos caracteres como extensión – NaturalBornCamper

+1

ty! tenga en cuenta que debe usar comillas simples si no realiza la sustitución de variables, p. '" $ var "' – aelgoa

1

Puede establecer la duración del patrón de expresión regular utilizando el operador {x,y}. {3,4} coincidiría si el patrón anterior ocurre 3 o 4 veces.

Pero no creo que realmente lo necesite. ¿Qué vas a hacer con un archivo llamado "This.is"?

67

Desde el manual, pathinfo:

<?php 
    $path_parts = pathinfo('/www/htdocs/index.html'); 

    echo $path_parts['dirname'], "\n"; 
    echo $path_parts['basename'], "\n"; 
    echo $path_parts['extension'], "\n"; 
    echo $path_parts['filename'], "\n"; // Since PHP 5.2.0 
?> 

No tiene que ser una ruta completa para funcionar correctamente. Será tan felizmente analizar file.jpg como /path/to/my/file.jpg.

+0

ya he comprobado esto. mismo error que el anterior. acceso Try "$ path_parts [ 'nombre']" de T.sec - "xxx" 23 12 32 3 twym2 un se devolverá sólo T. desde arriba ejemplo, no debe quitar nada – marc

5

Encontré muchos ejemplos en Google pero están mal porque simplemente eliminé parte de la cadena con "."

En realidad, eso es absolutamente lo que hay que hacer. Adelante y usa eso.

La extensión de archivo es todo después del último punto, y no hay ningún requisito para que una extensión de archivo sea un número particular de caracteres. Incluso hablando solo de Windows, ya viene con extensiones de archivo que no caben entre 3 y 4 caracteres, como por ejemplo. .

+2

... y no olvides '.htaccess' y' .htpasswd' en entornos apache. – h2ooooooo

6

Puede usar lo que PHP ha incorporado para ayudar ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME); 

Aunque si sólo se trata de un nombre de archivo (.somefile.jpg), obtendrá ...

./somefile

See it on CodePad.org

O utilizar una expresión regular ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path); 

See it on CodePad.org

Si usted no tiene un camino, pero sólo un nombre de archivo, esto va a funcionar y ser mucho más concisa ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME); 

See it on CodePad.org

Por supuesto, estos ambos sólo busca el último período (.).

46

Uso PHP basename()

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

Salidas: string (4) "prueba"

+2

+1 Si los requisitos mencionados para una extensión no son estrictos, esta sería la respuesta perfecta. – Kayla

+0

Mirando los commits en [php.net] (http://php.net/manual/en/function.basename.php#85597) hay una idea sobre trabajar con una matriz ... que creo que podría mejorarse el uso de algo como [array-walk] (http://php.net/manual/en/function.array-walk.php) – CrandellWS

7

El siguiente código funciona bien para mí, y es bastante corto. Simplemente divide el archivo en una matriz delimitada por puntos, elimina el último elemento (que es hipotéticamente la extensión) y vuelve a reformar la matriz con los puntos.

$filebroken = explode('.', $filename); 
$extension = array_pop($filebroken); 
$fileTypeless = implode('.', $filebroken); 
+0

devolverá falso si el archivo no tiene extensión o está vacío si el archivo es '.htaccess' –

4

Hay algunas maneras de hacerlo, pero creo que una de las maneras más rápidas es el siguiente

// $filename has the file name you have under the picture 
$temp = explode('.', $filename); 
$ext = array_pop($temp); 
$name = implode('.', $temp); 

Otra solución es la siguiente. No Lo He probado, pero parece que se debe trabajar para varios períodos en un nombre de archivo

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.')))); 

también:

$info = pathinfo($filename); 
$name = $info['filename']; 
$ext = $info['extension']; 

// Or in PHP 5.4, i believe this should work 
$name = pathinfo($filename)[ 'filename' ]; 

En todos ellos, $name contiene el nombre del archivo sin la extensión

0

utilice:

strstr('filename.ext','.',true); 
//result filename 
+0

Esto solo funciona si el nombre de archivo no tiene un punto ya. Los documentos de PHP mencionan la primera aparición de aguja – relipse

21

Esta es una solución bastante fácil y funcionará sin importar cuánto tiempo la extensión o cuántos puntos u otros caracteres hay en la cadena.

$filename = "abc.def.jpg"; 

$newFileName = substr($filename, 0 , (strrpos($filename, "."))); 

//$newFileName will now be abc.def 

Básicamente esto solo busca la última ocurrencia de. y luego utiliza la subcadena para recuperar todos los caracteres hasta ese punto.

Es similar a uno de sus ejemplos en Google pero más simple, más rápido y más fácil que las expresiones regulares y los otros ejemplos. Bien, de todos modos. Espero que ayude a alguien.

+0

Sé que esto es demasiado tarde, pero creo que esta es la mejor respuesta. Funciona genial. –

0

Intente utilizar este. seguramente eliminará la extensión del archivo.

$filename = "image.jpg"; 
$e = explode(".", $filename); 
foreach($e as $key=>$d) 
{ 
if($d!=end($e) 
{ 

$new_d[]=$d; 
} 

} 
echo implode("-",$new_t); // result would be just the 'image' 
+0

Puede reducir esto a una línea con array_pop() –

0

EDITAR: El enfoque más inteligente mi humilde opinión, que elimina la último punto y el texto siguiente de un nombre de archivo (también conocido como la extensión):

$name = basename($filename, '.' . end(explode('.', $filename))); 

Saludos;)

0

Como otros mencionan, la idea de limitar la extensión a un cierto número de caracteres no es válida. Ir con la idea de array_pop, pensando en una cadena delimitada como una matriz, esta función ha sido útil para mí ...

function string_pop($string, $delimiter){ 
    $a = explode($delimiter, $string); 
    array_pop($a); 
    return implode($delimiter, $a); 
} 

Uso:

$filename = "pic.of.my.house.jpeg"; 
$name = string_pop($filename, '.'); 
echo $name; 

Salidas:

pic.of.my.house (note it leaves valid, non-extension "." characters alone) 

En acción:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0

0
$image_name = "this-is.file.name.jpg"; 
$last_dot_index = strrpos($image_name, "."); 
$without_extention = substr($image_name, 0, $last_dot_index); 

Salida:

this-is.file.name 
Cuestiones relacionadas