PHP, Dateinamen ohne Dateierweiterung abrufen


205

Ich habe diesen PHP-Code:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

Wenn ich eine Datei mit dem Namen habe my.zip, wird diese Funktion zurückgegeben .zip.

Ich möchte das Gegenteil tun, ich möchte, dass die Funktion myohne die Erweiterung zurückkehrt.

Die Datei ist nur eine Zeichenfolge in einer Variablen.


Antworten:


397

Das alles ist nicht nötig. Schauen Sie sich pathinfo () an , es gibt Ihnen alle Komponenten Ihres Pfades.

Beispiel aus dem Handbuch:

$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"; // filename is only since PHP 5.2.0

Ausgabe des Codes:

/www/htdocs
index.html
html
index

Und alternativ können Sie nur bestimmte Teile erhalten wie:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3
Warum wurde das abgelehnt? Die Antwort ist absolut richtig. pathinfo verarbeitet Zeichenfolgen, sodass es keine Rolle spielt, ob sich die Datei tatsächlich auf dem Server befindet oder nicht.
Gordon

13
Es ist bedauerlich, dass sie "Basisname" falsch benannt haben, da der vollständige Dateiname mit der Erweiterung und nicht der Basisname zurückgegeben wird.
Oscar

1
@Oscar ist die am weitesten verbreitete Bedeutung des Begriffs basename. Keine falsche Benennung.
Nawfal

1
Dies ist sehr nützlich, insbesondere wenn Sie die Dateierweiterung nicht kennen müssen, um sie zu extrahieren.
Vahid Amiri

Dies ist eine äußerst elegante Lösung. Ein großes Lob. Dies sollte als die richtige Antwort markiert werden.
Native Coder

199

Alternativ pathinfo()können Sie verwenden

  • basename() - Gibt die Dateinamenkomponente des Pfads zurück

Beispiel aus dem PHP-Handbuch

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

Sie müssen die Erweiterung kennen, um sie im Voraus entfernen zu können.

Da Ihre Frage jedoch darauf hindeutet, dass Sie die Erweiterung benötigen und den Basisnamen , würde ich Pekkas Antwort als die nützlichste wählen , da sie Ihnen alle gewünschten Informationen über den Pfad und die Datei mit einem einzigen Muttersprachler liefert Funktion.


1
Was ist, wenn ich nicht über die Dateierweiterung Bescheid weiß? Sagen wir, wenn der Pfad dynamisch ist, kann jeder Typ der Dateierweiterung darin enthalten sein. dann was ??
user889030

@ user889030 dann hast du ein anderes szenario als das op und verwendest es nicht basename, aber pathinfowie auf der seite gezeigt.
Gordon

72

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

Einfacher Funktionstest: https://ideone.com/POhIDC


Dies würde den Dateinamen mit der Erweiterung
user966939

2
@ user966939 Mhh, nein mit Erweiterung ist basename;-)
yckart

Nun, so oder so, er bat um eine Lösung OHNE Erweiterung. ;)
user966939

2
@ user966939, Alter, es gibt überhaupt keine Erweiterung. Es ist PATHINFO_FILENAMEnicht PATHINFO_EXTENSION ...
Pacerier

20
Wer entschieden hat, dass filenamees keine Verlängerung basenamegibt, muss einige sadistische Tendenzen haben ...
Mark

12

Ein anderer Ansatz ist die Verwendung regulärer Ausdrücke.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

Dies wird von der letzten Periode .bis zum Ende der Zeichenfolge entfernt.


Ich mag diese Antwort, sehr einfach und funktioniert, wenn Sie die Erweiterung nicht kennen.
Relipse

Viel besser als Explode und fängt nur den letzten
Punktabschnitt ab,

7
Nein , es ist viel viel schlimmer. Hör auf, Leute neu zu formulieren.
Pacerier

Vielen Dank, und die obigen Kommentare haben es geschafft. Wenn Sie die Erweiterung nicht kennen müssen, ist dies nützlicher.
James Taylor

1
@ caiosm1005, Die Angriffsfläche nimmt sofort zu, da es schwierig ist, gegen die Interna einer Regex-Engine zu argumentieren. Im obigen Code wäre es beispielsweise nicht ungewöhnlich, wenn Eingaben vorhanden wären, $fileNamedie dazu führen könnten, dass die Engine in exponentieller (oder schlechterer) Zeit läuft. Unter der Annahme, dass wir die Interna dieser spezifischen Regex-Engine vollständig analysiert und theoretisch bewiesen haben, dass sie gegenüber allen möglichen Werten robust $fileNameist, ist der Code immer noch nicht willkürlich auf eine andere Plattform portierbar, auf der eine andere Implementierung der Regex-Engine vorhanden ist.
Pacerier

12

Wenn die Erweiterung nicht bekannt ist, verwenden Sie diese Lösung

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

PHP MAN Funktion pathinfo


Bitte geben Sie ein Like auf der PHP-Manpage für pathinfo. Dies wird OP dabei helfen, die ShowFileExtensionMethode zu verbessern, und bietet jedem, der versucht, diese Antwort zu finden, zusätzliche Informationen. Auch eine kleine Beschreibung würde nicht in die Irre gehen ...
Michael Coxon

1
Ich habe diese Frage bereits mit der gleichen Lösung beantwortet, ~ 2 Jahre vor Ihrer;)
yckart

@yckart true, aber dies gibt mehrere Beispiele in der Antwort. Ihre hat den Vorteil, auf ideone.com zu verlinken, aber die Website könnte offline gehen.
Adam Elsodaney

7

@Gordon Basisname funktioniert gut, wenn Sie die Erweiterung kennen, wenn Sie nicht explodieren können:

$filename = end(explode(".", $file));

1
Bitte richten Sie Kommentare mit der Kommentarfunktion unter meiner Antwort an mich. Die am besten geeignete Funktion hierfür ist pathinfo, weshalb ich basenamenur als Alternative angegeben habe. Es besteht keine Notwendigkeit, pathinfomit Regex oder neu zu erfinden explode.
Gordon

4
@fire, Dein Update macht keinen Sinn. end(explode(".", $file));gibt Ihnen die Erweiterung, nicht den Dateinamen.
Pacerier

7

Fast alle der oben genannten Lösungen haben den angezeigten Dateinamen von der Variablen $ path

Das folgende Snippet zeigt den aktuell ausgeführten Dateinamen ohne Erweiterung an

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

Erläuterung

$ _SERVER ['SCRIPT_NAME'] enthält den Pfad des aktuellen Skripts.



4

@fire Wenn der Dateiname Punkte verwendet, können Sie die falsche Ausgabe erhalten. Ich würde die @ Gordon-Methode verwenden, aber auch die Erweiterung erhalten, sodass die Basename-Funktion mit allen Erweiterungen wie folgt funktioniert:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

in meinem Fall benutze ich unten. Es ist mir egal, wie weit es reicht. : D Ich denke, es wird dir helfen

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

Übrigens: Sie haben einen Tippfehler in$extenion
Thomas Kekeisen

2

Du kannst das schreiben

$filename = current(explode(".", $file));

Diese geben das aktuelle Element des Arrays zurück, wenn es zuvor nicht verwendet wurde.


Hallo, bitte überprüfen Sie, bevor Sie ein Downgrade durchführen. Es funktioniert Ich hatte es schon oft in meinem Code verwendet. Mit dieser Funktion können Sie nur einen Dateinamen erhalten, wenn Ihr Dateiname "xyz.jpg" ist. Es funktioniert möglicherweise nicht mit Dateinamen, die den gesamten Pfad enthalten.
Jitendra Pawar

Dies funktioniert auch nicht richtig, wenn ein Dateiname mehrere Punkte enthält, z. B. "some.interesting.image.jpg"
ganzpopp

2

Kurz

echo pathinfo(__FILE__)['filename']; // since php 5.2

gut. Aber wenn ich über Code setzen in b.phpund i ausgeführt a.phphaben require('b.php'). Dann wird wie bstatta
Rohan Khude

1

Dateiname ohne Dateierweiterung, wenn Sie diese Erweiterung nicht kennen:

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


2
Wie wäre es, wenn die Erweiterung so etwas wie .tar.gz ist?
Arda

1

Wenn Sie nicht wissen, welche Erweiterung Sie haben, können Sie Folgendes versuchen:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Arbeiten mit allen Möglichkeiten:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

Ihre Antwort ist unter der perfekten Lösung, um die Dateierweiterung in PHP zu verbergen.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

Die vorhandenen Lösungen schlagen fehl, wenn eine Erweiterung mehrere Teile enthält. Die folgende Funktion funktioniert für mehrere Teile, einen vollständigen Pfad oder nur einen Dateinamen:

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

0

Dies gibt nur den Dateinamen ohne Erweiterung in 1 Zeile zurück:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.