Comment supprimer l'extension de la chaîne (seule extension réelle!)

135

Je recherche une petite fonction qui me permet de supprimer l'extension d'un nom de fichier.

J'ai trouvé de nombreux exemples en googlant, mais ils sont mauvais, car ils ne font que supprimer une partie de la chaîne avec "." . Ils utilisent dot pour limiteur et coupent simplement la corde.

Regardez ces scripts,

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

ou

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

Lorsque nous ajoutons la chaîne comme ceci:

Ceci est un exemple de somestring

Il ne retournera que "This" ...

L'extension peut avoir 3 ou 4 caractères, nous devons donc vérifier si le point est en position 4 ou 5, puis le supprimer.

Comment ceci peut être fait?

Marc
la source
1
Qu'est-ce qu'une "vraie" extension? Vous voulez supprimer les 4 derniers ou les derniers caractères s'ils sont précédés d'un point?
clyfe
"Col. Shrapnel" - il est conçu pour les utilisateurs de Windows. "clyfe" - oui, je veux tout supprimer après le point, mais seulement s'il est en position 4 ou 5, ce qui représentera ".jpeg" ou ".mp3". Je ne veux juste pas l'enlever. Je sais que je peux le faire manuellement en utilisant str-pos et couper la chaîne en utilisant l'instruction if (si 5 pos = point puis couper (rtrim) à partir de 5 caractères à droite, si 4 pos = point puis rtrim 4, sinon retourner sans aucune modification. Mais peut-être que c'est une solution plus rapide.
marc
3
Qu'en est-il des fichiers .package? Ou .unité? Cela semble un peu arbitraire de restreindre une extension à 4 caractères.
rdb le

Réponses:

172

Essaye celui-là:

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

Donc, cela correspond à un point suivi de trois ou quatre caractères qui ne sont ni un point ni un espace. La règle "3 ou 4" devrait probablement être assouplie, car il existe de nombreuses extensions de fichiers plus courtes ou plus longues.

nickf
la source
le problème est qu'il y a aussi des gens qui renomment des fichiers comme:20120720.something.somethingelse.jpg
Obmerk Kronen
3
Je ne pense pas que cela fonctionnera avec des fichiers avec deux caractères comme extension
NaturalBornCamper
1
ty! veuillez noter que vous devez utiliser des guillemets simples si vous n'effectuez pas de substitution de variable, par exemple"$var"
aelgoa
eh bien, pour l'utiliser avec des fichiers .py, je suppose que vous devez ajouter 2,3,4 au lieu de seulement 3,4:> merci!
voghDev
2
@voghDev pour prendre en charge les extensions de 2 à 4 caractères que vous devriez ajouter à la {2,4}place{3,4}
Timo Huovinen
81

À partir du manuel, 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
?>

Il n'est pas nécessaire que ce soit un chemin complet pour fonctionner correctement. Il sera tout aussi bien analysé file.jpgque /path/to/my/file.jpg.

Erik
la source
J'ai déjà vérifié cela. Même erreur que ci-dessus. Essayez d'accéder à "$ path_parts ['filename']" depuis T.sec - "xxx" 23 12 32 3 a twym2 Il ne retournera que T. De l'exemple ci-dessus, il ne devrait rien supprimer!
marc
56

Utilisez PHP basename ()

(PHP 4, PHP 5)

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

Sorties: string (4) "test"

Lamy
la source
2
+1 Si les exigences mentionnées pour une extension n'étaient pas strictes, ce serait la réponse parfaite.
Kayla
1
En regardant les commits sur php.net, il y a une idée de travailler avec un tableau ... qui, je pense, pourrait être améliorée en utilisant quelque chose comme array-walk
CrandellWS
35

C'est une solution assez simple et fonctionnera quelle que soit la longueur de l'extension ou le nombre de points ou d'autres caractères dans la chaîne.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

Fondamentalement, cela recherche simplement la dernière occurrence de. puis utilise sous-chaîne pour récupérer tous les caractères jusqu'à ce point.

C'est similaire à l'un de vos exemples Google mais plus simple, plus rapide et plus facile que les expressions régulières et les autres exemples. Eh bien imo de toute façon. J'espère que ça aide quelqu'un.

wprenison
la source
2
Je sais que cela arrive trop tard, mais je pense que c'est la meilleure réponse. Fonctionne très bien.
Agbogidi Michael
cela ne fonctionnera pas pour les fichiers cachés * nix sans extension par exemple,.htaccess
Fr0zenFyr
12

Vous pouvez utiliser ce que PHP a intégré pour vous aider ...

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

Cependant, si vous ne traitez qu'avec un nom de fichier ( .somefile.jpg), vous obtiendrez ...

./somefile

Voir sur CodePad.org

Ou utilisez une regex ...

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

Voir sur CodePad.org

Si vous n'avez pas de chemin, mais juste un nom de fichier, cela fonctionnera et sera beaucoup plus laconique ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Voir sur CodePad.org

Bien sûr, tous les deux ne recherchent que le dernier point ( .).

Alex
la source
Comme mentionné sur la dernière ligne de solution, il échouera pour les noms de fichiers tels que.htaccess
Fr0zenFyr
8

Le code suivant fonctionne bien pour moi, et il est assez court. Il divise simplement le fichier en un tableau délimité par des points, supprime le dernier élément (qui est hypothétiquement l'extension) et reforme le tableau avec les points à nouveau.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);
Emanegux
la source
retournera false si le fichier n'a pas d'extension ou vide si le fichier est.htaccess
Timo Huovinen
5

J'ai trouvé de nombreux exemples sur Google mais il y en a de mauvais car il suffit de supprimer une partie de la chaîne avec "."

En fait, c'est absolument la bonne chose à faire. Allez-y et utilisez cela.

L'extension de fichier est tout après le dernier point, et il n'est pas nécessaire qu'une extension de fichier soit un nombre particulier de caractères. Même en parlant uniquement de Windows, il est déjà livré avec des extensions de fichier qui ne correspondent pas à 3-4 caractères, comme par exemple. .manifest.

bobince
la source
2
..et n'oublions pas .htaccesset .htpasswddans les environnements apache.
h2ooooooo
5

Utilisation recommandée: pathinfo avec PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);
Alex
la source
4

Il y a plusieurs façons de le faire, mais je pense que l'un des moyens les plus rapides est le suivant

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

Une autre solution est la suivante. Je ne l'ai pas testé, mais il semble qu'il devrait fonctionner pendant plusieurs périodes dans un nom de fichier

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

Aussi:

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

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

Dans tous ceux-ci, $namecontient le nom de fichier sans l'extension

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

Production:

this-is.file.name
Abhishek
la source
1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Ajoutez cela pour obtenir l'extension du fichier.
I_ATE_YOUR_WORK_FILES
2

Comme d'autres le mentionnent, l'idée de limiter l'extension à un certain nombre de caractères est invalide. Partant de l'idée de array_pop, en pensant à une chaîne délimitée comme un tableau, cette fonction m'a été utile ...

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

Usage:

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

Les sorties:

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

En action:

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

jbobbins
la source
1

Vous pouvez définir la longueur du modèle d'expression régulière à l'aide de l' {x,y}opérateur.{3,4}correspondrait si le motif précédent se produit 3 ou 4 fois.

Mais je ne pense pas que vous en ayez vraiment besoin. Que ferez-vous avec un fichier nommé "This.is"?

Votre bon sens
la source
0

Utilisez ceci:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
la source
Cela ne fonctionne que si le nom de fichier n'a pas déjà de point. La documentation PHP mentionne la première occurrence de l'aiguille
relipse
0

Essayez d'utiliser celui-ci. cela supprimera sûrement l'extension de fichier.

$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'
Gilbert Aldava
la source
Vous pouvez réduire cela à une ligne avec array_pop ()
Peter Brand
0

EDIT : L'approche la plus intelligente à mon humble avis, elle supprime le dernier point et le texte suivant d'un nom de fichier (aka l'extension):

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

À votre santé ;)

andcl
la source
Bien que cela puisse fonctionner, il end()n'est pas censé fonctionner avec une fonction passée en paramètre. Il produit également un avis: seules les variables doivent être passées par référence
CodeBrauer
0

Cela fonctionne lorsqu'il y a plusieurs parties dans une extension et est à la fois court et efficace:

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file
Dan Bray
la source