PHP, dosya adı olmadan dosya adı al


206

Bu PHP kodu var:

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]);
    }
}

Adında bir dosyam varsa my.zip, bu işlev geri döner .zip.

Tersini yapmak istiyorum, fonksiyonun myuzantı olmadan geri dönmesini istiyorum .

Dosya sadece bir değişkende bir dizedir.


Yanıtlar:


400

Bunlara gerek yok. Check out PathInfo () , bu size yolunuzun tüm bileşenlerini verir.

Kılavuzdan örnek:

$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

Kod çıktısı:

/www/htdocs
index.html
html
index

Alternatif olarak, yalnızca aşağıdaki gibi belirli parçaları alabilirsiniz:

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

3
Bu neden reddedildi? Cevap kesinlikle doğru. pathinfo dizelerde çalışır, bu nedenle dosyanın gerçekten sunucuda olup olmadığı önemli değildir.
Gordon

13
Temel adı değil, uzantı ile tam dosya adını döndürdüğü için "basename" adını vermeleri talihsiz bir durumdur.
Oscar

1
@Oscar, terimin en yaygın anlaşılan anlamıdır basename. Yanlış isim yok.
nawfal

1
Bu, özellikle dosya uzantısını ayıklamak için bilmeniz gerekmediğinde çok kullanışlıdır.
Vahid Amiri

Bu son derece zarif bir çözüm. Kudos. Bu doğru cevap olarak işaretlenmelidir.
Yerel Kodlayıcı

199

Alternatif olarak pathinfo(),

  • basename() - Yolun dosya adı bileşenini döndürür

PHP kılavuzundan örnek

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

Uzantıyı önceden kaldırmak için önceden bilmeniz gerekir.

Ancak, sorunuz uzantıyı ve temel adı almanız gerektiğini önerdiğinden , Pekka'nın cevabını en faydalı cevap olarak oylayacağım , çünkü size tek bir yerli ile yol ve dosya hakkında istediğiniz herhangi bir bilgiyi verecektir işlevi.


1
ne dosya uzantısı hakkında bilmiyorsanız .. yol dinamik varsa diyelim dosya uzantısı anytype içinde gelebilir! sonra ne ??
user889030

@ user889030 sonra OP'den farklı bir senaryo var ve kullanmayın basename, ancak pathinfosayfada gösterildiği gibi.
Gordon

72

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

pathinfo($path, PATHINFO_FILENAME);

Basit fonksiyonel test: https://ideone.com/POhIDC


Bu dosya adını dönecekti ile uzatma
user966939

2
@ user966939 Mhh, bir ile uzantısıdır basename;-)
yckart

Her iki durumda da, uzantı OLMADAN bir çözüm istiyordu. ;)
user966939

2
@ user966939, Dostum hiç uzantı yok. O var PATHINFO_FILENAMEdeğil, PATHINFO_EXTENSION ....
Pacerier

20
Bunun filenamebir uzantısı olmadığına kim karar verdiğinde basenamesadist eğilimler olmalı ...
Mark

12

Başka bir yaklaşım da düzenli ifadeler kullanmaktır.

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

Bu, son noktadan .dizenin sonuna kadar kaldırılır .


Bu cevabı beğendim, çok basit ve uzantıyı bilmediğinizde çalışıyor.
15'te emanet


7
Hayır , çok daha kötü. İnsanları normal şekilde ifade etmeyi bırak.
Pacerier

Teşekkürler ve yukarıdaki yorumlar çivilenmişti. Uzantının bilinmemesi bunu daha kullanışlı hale getirir.
James Taylor

1
@ caiosm1005, Saldırı yüzeyi derhal artar çünkü normal regex motorun içlerine karşı akıl yürütmek zordur. Örneğin, yukarıdaki kodda $fileName, motorun üstel (veya daha kötü) sürede çalışmasına neden olabilecek bazı girişler olması tuhaf olmaz . Ve bu özel regex motorunun iç kısımlarını kesmeyi bitirdiğimizi ve teorik olarak olası her değere karşı sağlam olduğunu kanıtladığımızı varsayarsak $fileName, kod hala regex motorunun başka bir uygulamasına sahip başka bir platforma keyfi olarak taşınabilir değildir.
Pacerier

12

Uzantı bilinmiyorsa, bu çözümü kullanın

 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 işlev yolu bilgisi


Lütfen php man sayfasına bir beğeni verin pathinfo. Bu OP'nin ShowFileExtensionyöntemi daha iyi hale getirmesine yardımcı olacak ve bu cevabı bulmaya çalışan herkes için ekstra okuma sağlayacaktır. Ayrıca bir açıklama biraz sapmaz ...
Michael Coxon

1
Bu soruyu zaten aynı çözümle cevapladım, ~ 2 yıl önce sizinkinden;)
yckart

@yckart true ama bu cevap içinde birden fazla örnek veriyor. Sizinki ideone.com'a bağlanma avantajına sahiptir, ancak site çevrimdışı olabilir.
Adam Elsodaney

7

@Gordon basename uzantıyı biliyorsanız iyi çalışır, yoksa patlayabilir kullanabilirsiniz:

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

1
Lütfen cevabımın altındaki yorum fonksiyonu ile yorumları bana yönlendirin. Bunun için en uygun fonksiyon, bu pathinfoyüzden basenamesadece alternatif olarak verdim . pathinfoRegex veya ile yeniden icat etmeye gerek yoktur explode.
Gordon

4
@fire, Güncellemenizin bir anlamı yok. end(explode(".", $file));dosya adını değil uzantıyı size verir.
Pacerier

7

Yukarıdaki çözümün neredeyse tamamı değişken $ yolundan gösterilen alma dosya adına sahiptir.

Snippet'in altındaki geçerli yürütülen dosya adını uzantı olmadan alacaksınız

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

açıklama

$ _SERVER ['SCRIPT_NAME'] geçerli komut dosyasının yolunu içeriyor.



4

@fire dosya adı noktalar kullanırsa, yanlış çıktı alabilirsiniz. @Gordon yöntemini kullanırdım, ancak uzantıyı da alırsınız, bu nedenle taban adı işlevi şu gibi tüm uzantılarla çalışır:

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

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

4

benim durumumda, aşağıda kullanıyorum. Ne kadar uzandığı umurumda değil. : Sanırım sana yardımcı olacak

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

Btw .: Bir yazım hatası var$extenion
Thomas Kekeisen

2

Bunu yazabilirsin

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

Bunlar, daha önce kullanılmazsa dizinin geçerli öğesini döndürür.


Merhaba, lütfen indirmeden önce kontrol edin. Kodumda defalarca kullandım çalışıyor. Bu işlevi kullanarak dosya adınız "xyz.jpg" ise sadece bir dosya adı alabilirsiniz. İçinde tüm yolu içeren dosya adlarıyla çalışmayabilir.
Jitendra Pawar

Bir dosya adında birden fazla nokta varsa, bu da düzgün çalışmaz, örn. "Some.interesting.image.jpg"
ganzpopp

2

Kısa

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

iyi. Ama eğer yukarıda kod koymak b.phpve i a.phpsahip idam require('b.php'). Sonra çıktı nasıl byerinea
Rohan Khude

1

Bu uzantıyı bilmediğinizde dosya uzantısı olmayan dosya adı:

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


2
Uzantının .tar.gz gibi bir şey olup olmadığı nasıl olur?
Arda

1

Hangi uzantıya sahip olduğunuzu bilmiyorsanız, bunu deneyebilirsiniz:

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

Tüm olasılıklarla çalışma:

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

1

Cevabınız php dosya uzantısını gizlemek için mükemmel bir çözüm altında.

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

1

Bir uzantının birden fazla parçası olduğunda mevcut çözümler başarısız olur. Aşağıdaki işlev birden çok parça, tam yol veya sadece aa dosya adı için çalışır:

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

Bu, yalnızca 1 satırda uzantı içermeyen dosya adını döndürür:

$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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.