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.

Mostafa Elkady
quelle

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
Tschechologie
quelle
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.

Gordon
quelle
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

yckart
quelle
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.

caiosm1005
quelle
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

anydasa
quelle
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));
Feuer
quelle
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.

Rohan Khude
quelle
7

Es ist nicht nötig, viel Code zu schreiben. Auch dies kann nur durch eine Codezeile erfolgen. Siehe hier

Unten finden Sie den einzeiligen Code, der nur den Dateinamen zurückgibt und den Erweiterungsnamen entfernt:

<?php
 echo pathinfo('logo.png')['filename'];
?>

Es wird gedruckt

logo

Quelle: Entfernen Sie die Erweiterung und geben Sie nur den Dateinamen in PHP zurück

Faruque Ahamed Mollick
quelle
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"
NSINE
quelle
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.
Hoàng Vũ Tgtt
quelle
Ü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.

Jitendra Pawar
quelle
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
Mariovials
quelle
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, "."));

user2047861
quelle
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"
Ghanshyam Gohel
quelle
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");
?>
shaz3e
quelle
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
Dan Bray
quelle
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"
Vincenzo Ruffa
quelle