So entfernen Sie die Erweiterung aus dem String (nur echte Erweiterung!)

135

Ich suche nach einer kleinen Funktion, mit der ich die Erweiterung aus einem Dateinamen entfernen kann.

Ich habe viele Beispiele durch Googeln gefunden, aber sie sind schlecht, weil sie nur einen Teil der Zeichenfolge mit "entfernen". . Sie verwenden Punkt als Begrenzer und schneiden nur Schnur.

Schauen Sie sich diese Skripte an,

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

oder

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

Wenn wir den String wie folgt hinzufügen:

Dies ist ein Beispiel für etwas

Es wird nur "This" zurückgegeben ...

Die Erweiterung kann 3 oder 4 Zeichen enthalten, daher müssen wir prüfen, ob sich der Punkt auf der Position 4 oder 5 befindet, und ihn dann entfernen.

Wie geht das?

marc
quelle
1
Was ist eine "echte" Erweiterung? Sie möchten die letzten 4 oder weniger Zeichen entfernen, wenn ihnen ein Punkt vorangestellt ist?
Clyfe
"Col. Shrapnel" - ist für Windows-Benutzer konzipiert. "clyfe" - ja, ich möchte alles nach dem Punkt entfernen, aber nur wenn es sich auf der 4 oder 5 Position befindet, was ".jpeg" oder ".mp3" darstellt. Ich werde es einfach nicht entfernen. Ich weiß, dass ich es manuell mit str-pos machen und den String mit der if-Anweisung schneiden kann (wenn 5 pos = Punkt, dann schneide (rtrim) von rechts 5 Zeichen, wenn 4 pos = Punkt, dann rtrim 4, sonst kehre ich ohne Modifikation zurück Vielleicht ist es eine schnellere Lösung.
Marc
3
Was ist mit .package-Dateien? Oder .unity? Scheint etwas willkürlich, um eine Erweiterung auf 4 Zeichen zu beschränken.
Rdb

Antworten:

172

Probier diese:

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

Dies entspricht also einem Punkt, gefolgt von drei oder vier Zeichen, die kein Punkt oder Leerzeichen sind. Die "3 oder 4" -Regel sollte wahrscheinlich gelockert werden, da es viele Dateierweiterungen gibt, die kürzer oder länger sind.

nickf
quelle
Das Problem ist, dass es auch Leute gibt, die Dateien umbenennen wie:20120720.something.somethingelse.jpg
Obmerk Kronen
3
Ich denke nicht, dass dies mit Dateien mit zwei Zeichen als Erweiterung
funktionieren wird
1
ty! Bitte beachten Sie, dass Sie einfache Anführungszeichen verwenden sollten, wenn Sie "$var"
keine
Nun, um es mit .py-Dateien zu verwenden, müssen Sie wahrscheinlich 2,3,4 anstelle von nur 3,4 hinzufügen:> Danke!
VoghDev
2
@voghDev, um Erweiterungen mit 2 bis 4 Zeichen zu unterstützen, sollten Sie {2,4}anstelle von{3,4}
Timo Huovinen
81

Aus dem Handbuch, 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
?>

Es muss kein vollständiger Pfad sein, um ordnungsgemäß zu funktionieren. Es wird genauso glücklich analysiert file.jpgwie /path/to/my/file.jpg.

Erik
quelle
Ich habe das schon überprüft. Gleicher Fehler wie oben. Versuchen Sie, von T.sec auf "$ path_parts ['filename']" zuzugreifen - "xxx" 23 12 32 3 a twym2 Es wird nur T zurückgegeben. Aus dem obigen Beispiel sollte nichts entfernt werden!
Marc
56

Verwenden Sie den PHP-Basisnamen ()

(PHP 4, PHP 5)

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

Ausgaben: Zeichenfolge (4) "Test"

Lamy
quelle
2
+1 Wenn die genannten Anforderungen für eine Erweiterung nicht streng wären, wäre dies die perfekte Antwort.
Kayla
1
Wenn man sich die Commits auf php.net ansieht, gibt es eine Idee über die Arbeit mit einem Array ... die meiner Meinung nach mit etwas wie Array-Walk
CrandellWS
35

Dies ist eine ziemlich einfache Lösung und funktioniert unabhängig davon, wie lange die Erweiterung oder wie viele Punkte oder andere Zeichen in der Zeichenfolge enthalten sind.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

Grundsätzlich sucht dies nur nach dem letzten Vorkommen von. und verwendet dann Teilzeichenfolge, um alle Zeichen bis zu diesem Punkt abzurufen.

Es ähnelt einem Ihrer gegoogelten Beispiele, ist jedoch einfacher, schneller und einfacher als reguläre Ausdrücke und die anderen Beispiele. Na imo sowieso. Hoffe es hilft jemandem.

wprenison
quelle
2
Ich weiß, dass dies viel zu spät kommt, aber ich denke, das ist die beste Antwort. Funktioniert super.
Agbogidi Michael
Dies funktioniert nicht für * nix versteckte Dateien ohne Erweiterung, zum Beispiel.htaccess
Fr0zenFyr
12

Sie können das, was PHP eingebaut hat, verwenden, um ...

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

Wenn Sie jedoch nur mit einem Dateinamen ( .somefile.jpg) arbeiten, erhalten Sie ...

./somefile

Sehen Sie es auf CodePad.org

Oder verwenden Sie einen regulären Ausdruck ...

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

Sehen Sie es auf CodePad.org

Wenn Sie keinen Pfad, sondern nur einen Dateinamen haben, funktioniert dies und ist viel kürzer ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Sehen Sie es auf CodePad.org

Natürlich suchen beide nur nach der letzten Periode ( .).

Alex
quelle
Wie in der letzten Zeile der Lösung erwähnt, wird es für Dateinamen wie.htaccess
Fr0zenFyr
8

Der folgende Code funktioniert gut für mich und ist ziemlich kurz. Es zerlegt die Datei einfach in ein durch Punkte begrenztes Array, löscht das letzte Element (das hypothetisch die Erweiterung ist) und reformiert das Array erneut mit den Punkten.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);
Emanegux
quelle
wird false zurückgeben, wenn die Datei keine Erweiterung hat, oder leer, wenn die Datei ist.htaccess
Timo Huovinen
5

Ich habe viele Beispiele bei Google gefunden, aber es gibt schlechte, weil nur ein Teil der Zeichenfolge mit "entfernt" wird.

Eigentlich ist das absolut richtig. Gehen Sie voran und nutzen Sie das.

Die Dateierweiterung steht alles nach dem letzten Punkt, und es ist nicht erforderlich, dass eine Dateierweiterung eine bestimmte Anzahl von Zeichen enthält. Selbst wenn nur über Windows gesprochen wird, enthält es bereits Dateierweiterungen, die nicht auf 3-4 Zeichen passen, wie z. .manifest.

Bobince
quelle
2
..und vergessen wir nicht .htaccessund .htpasswdin Apache-Umgebungen.
h2ooooooo
5

Empfohlene Verwendung: pathinfo mit PATHINFO_FILENAME

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

Es gibt einige Möglichkeiten, dies zu tun, aber ich denke, eine der schnelleren Möglichkeiten ist die folgende

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

Eine andere Lösung ist dies. Ich habe es nicht getestet, aber es sieht so aus, als ob es für mehrere Zeiträume in einem Dateinamen funktionieren sollte

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

Ebenfalls:

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

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

$nameEnthält in all diesen den Dateinamen ohne die Erweiterung

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

Ausgabe:

this-is.file.name
Abhishek
quelle
1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Fügen Sie das hinzu, um die Erweiterung der Datei zu erhalten.
I_ATE_YOUR_WORK_FILES
2

Wie bereits erwähnt, ist die Idee, die Erweiterung auf eine bestimmte Anzahl von Zeichen zu beschränken, ungültig. Ausgehend von der Idee von array_pop, diese begrenzte Zeichenfolge als Array zu betrachten, war diese Funktion für mich nützlich ...

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

Verwendung:

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

Ausgänge:

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

In Aktion:

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

Spulen
quelle
1

Sie können die Länge des Musters für reguläre Ausdrücke mithilfe des {x,y}Operators festlegen . {3,4}würde übereinstimmen, wenn das vorhergehende Muster 3 oder 4 Mal auftritt.

Aber ich glaube nicht, dass du es wirklich brauchst. Was machen Sie mit einer Datei namens "This.is"?

Ihr gesunder Menschenverstand
quelle
0

Benutze das:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
quelle
Dies funktioniert nur, wenn der Dateiname noch keinen Punkt hat. PHP - Dokumente erwähnen das erste Vorkommen von Nadel
relipse
0

Versuchen Sie, diesen zu verwenden. es wird sicherlich die Dateierweiterung entfernen.

$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
quelle
Sie könnten dies mit array_pop () auf eine Zeile reduzieren
Peter Brand
0

BEARBEITEN : Der klügste Ansatz IMHO, es entfernt den letzten Punkt und folgenden Text aus einem Dateinamen (auch bekannt als die Erweiterung):

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

Prost ;)

andcl
quelle
Es könnte zwar funktionieren, end()soll aber nicht mit einer als Parameter übergebenen Funktion funktionieren. Es wird auch ein Hinweis
ausgegeben
0

Dies funktioniert, wenn eine Erweiterung mehrere Teile enthält und sowohl kurz als auch effizient ist:

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
quelle