PHP, รับชื่อไฟล์โดยไม่มีนามสกุลไฟล์


205

ฉันมีรหัส PHP นี้:

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

หากฉันมีชื่อไฟล์my.zipฟังก์ชั่นนี้จะกลับ.zipมา

ฉันต้องการย้อนกลับฉันต้องการให้ฟังก์ชันส่งคืนmyโดยไม่มีนามสกุล

ไฟล์เป็นเพียงสตริงในตัวแปร


คำตอบที่ดีที่สุด: stackoverflow.com/questions/8123998/file-name-without-extension
Couru d'avance

คำตอบ:


398

ไม่จำเป็นสำหรับทุกสิ่งที่ ตรวจสอบpathinfo ()มันให้ส่วนประกอบทั้งหมดของเส้นทางของคุณ

ตัวอย่างจากคู่มือ:

$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

ผลลัพธ์ของรหัส:

/www/htdocs
index.html
html
index

และอีกทางหนึ่งคุณจะได้รับเฉพาะบางส่วนเช่น:

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

3
ทำไมเรื่องนี้จึงถูกลดระดับลง คำตอบนั้นถูกต้องอย่างแน่นอน pathinfo ทำงานบนสตริงดังนั้นจึงไม่สำคัญว่าไฟล์นั้นจะอยู่บนเซิร์ฟเวอร์จริงหรือไม่
กอร์ดอน

13
โชคไม่ดีที่พวกเขาใช้ชื่อ "basename" ผิดเนื่องจากส่งคืนชื่อไฟล์แบบเต็มที่มีนามสกุลไม่ใช่ชื่อฐาน
ออสการ์

1
@Oscar มันเป็นความหมายที่เข้าใจกันอย่างกว้างขวางที่สุดของคำbasenameว่า ไม่มีข้อผิดพลาด
nawfal

1
สิ่งนี้มีประโยชน์มากโดยเฉพาะเมื่อคุณไม่จำเป็นต้องรู้นามสกุลไฟล์เพื่อทำการขยาย
Vahid Amiri

นี่เป็นทางออกที่หรูหราอย่างยิ่ง ความรุ่งโรจน์ ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง
Native Coder

199

เป็นทางเลือกให้pathinfo()คุณสามารถใช้

  • basename() - ส่งคืนองค์ประกอบชื่อไฟล์ของเส้นทาง

ตัวอย่างจากคู่มือ PHP

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

คุณต้องรู้จักส่วนขยายเพื่อลบออกล่วงหน้า

อย่างไรก็ตามเนื่องจากคำถามของคุณแสดงให้เห็นว่าคุณมีความจำเป็นในการได้รับส่วนขยายและชื่อฐานฉันจึงให้คะแนนคำตอบของ Pekkaว่าเป็นประโยชน์มากที่สุดเพราะจะให้ข้อมูลใด ๆ ที่คุณต้องการเกี่ยวกับเส้นทางและไฟล์กับเจ้าของเดียว ฟังก์ชัน


1
เกิดอะไรขึ้นถ้าฉันไม่ทราบเกี่ยวกับนามสกุลไฟล์ .. ขอบอกว่าเส้นทางเป็นแบบไดนามิก anytype ของนามสกุลไฟล์สามารถเข้ามาได้ !! แล้วไง ??
user889030

@ user889030 จากนั้นคุณมีสถานการณ์ที่แตกต่างจาก OP และไม่ได้ใช้basenameแต่pathinfoดังแสดงในหน้าอื่น
Gordon

72

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

pathinfo($path, PATHINFO_FILENAME);

ทดสอบการทำงานง่าย ๆ : https://ideone.com/POhIDC


สิ่งนี้จะคืนชื่อไฟล์ที่มีนามสกุล
user966939

2
@ user966939 Mhh ไม่มีที่มีนามสกุลเป็นbasename;-)
yckart

อย่างใดอย่างหนึ่งเขาก็ถามหาทางออกโดยไม่ต้องขยาย ;)
966939

2
@ user966939 เพื่อนไม่มีส่วนขยายเลย มันPATHINFO_FILENAMEไม่ใช่PATHINFO_EXTENSION ....
Pacerier

20
ใครก็ตามที่ตัดสินใจว่าfilenameไม่มีส่วนขยายในขณะที่basenameจะต้องมีแนวโน้มที่มีนิสัยทารุณเมื่อเกิดตัณหาบางอย่าง ...
Mark

12

อีกวิธีคือใช้นิพจน์ทั่วไป

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

สิ่งนี้จะลบจากช่วงเวลาสุดท้าย.จนถึงจุดสิ้นสุดของสตริง


ฉันชอบคำตอบนี้ง่ายมากและทำงานเมื่อคุณไม่รู้จักนามสกุล
relipse

ดีกว่าการใช้ระเบิดและจับเฉพาะส่วนช่วงเวลาสุดท้ายในกรณีที่คุณใช้จุดในชื่อไฟล์
Kiwizoom

7
ไม่มันแย่กว่านั้นมาก หยุด regexing ผู้คน
Pacerier

ขอบคุณและความคิดเห็นข้างต้นถูกจับ การไม่ทราบว่าส่วนขยายทำให้สิ่งนี้มีประโยชน์มากขึ้น
James Taylor

1
@ caiosm1005, พื้นผิวการโจมตีเพิ่มขึ้นทันทีเพราะมันยากที่จะให้เหตุผลกับการทำงานของเครื่องยนต์ regex ตัวอย่างเช่นในรหัสข้างต้นมันจะไม่แปลกถ้ามีข้อมูลบางอย่าง$fileNameที่อาจทำให้เครื่องยนต์ทำงานในเวลาแบบเอ็กซ์โพเนนเชียล (หรือแย่กว่านั้น) และสมมติว่าเราได้เสร็จสิ้นการผ่า internals ของเครื่องยนต์ regex ที่เฉพาะเจาะจงนี้และได้พิสูจน์แล้วว่าทางทฤษฎีนั้นมีความทนทานต่อทุกค่าที่เป็นไปได้$fileNameรหัสยังไม่สามารถเคลื่อนย้ายได้อย่างอิสระไปยังแพลตฟอร์มอื่นที่มีการใช้งานโปรแกรม regex อื่น
Pacerier

12

หากไม่รู้จักนามสกุลให้ใช้วิธีนี้

 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 pathinfo


โปรดให้เช่นที่หน้า PHP pathinfoคนสำหรับ นี่จะช่วยให้ OP ทำได้ShowFileExtensionดีขึ้นและจะให้การอ่านเพิ่มเติมสำหรับทุกคนที่พยายามค้นหาคำตอบนี้ นอกจากนี้ยังมีบิตของคำอธิบายจะไม่ไปหลงทาง ...
ไมเคิล Coxon

1
ฉันได้ตอบคำถามนี้แล้วด้วยวิธีการแก้ปัญหาเดียวกัน ~ 2 ปีก่อนของคุณ;)
yckart

@yckart จริง แต่สิ่งนี้ให้หลายตัวอย่างภายในคำตอบ ของคุณมีประโยชน์ในการเชื่อมโยงไปยัง ideone.com แต่เว็บไซต์สามารถออฟไลน์ได้
Adam Elsodaney

7

@Gordon basename จะทำงานได้ดีถ้าคุณรู้นามสกุลถ้าคุณไม่สามารถใช้ explode ได้:

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

1
กรุณาแสดงความคิดเห็นโดยตรงกับฉันด้วยฟังก์ชั่นความคิดเห็นด้านล่างคำตอบของฉัน ฟังก์ชั่นที่เหมาะสมที่สุดสำหรับสิ่งนี้คือpathinfoซึ่งเป็นเหตุผลที่ฉันให้basenameเป็นทางเลือกเท่านั้น ไม่มีความจำเป็นที่จะบูรณาการเป็นpathinfoกับ regex explodeหรือ
Gordon

4
@fire การอัปเดตของคุณไม่สมเหตุสมผล end(explode(".", $file));ให้ส่วนขยายไม่ใช่ชื่อไฟล์
Pacerier

7

วิธีการแก้ปัญหาข้างต้นเกือบทั้งหมดมีชื่อไฟล์ที่แสดงจากตัวแปร $ path

ตัวอย่างด้านล่างจะได้รับชื่อไฟล์ที่เรียกใช้ปัจจุบันโดยไม่มีนามสกุล

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

คำอธิบาย

$ _SERVER ['SCRIPT_NAME'] มีเส้นทางของสคริปต์ปัจจุบัน


7

ไม่จำเป็นต้องเขียนโค้ดจำนวนมาก แม้ว่ามันจะสามารถทำได้เพียงแค่หนึ่งบรรทัดของรหัส ดูที่นี่

ด้านล่างเป็นรหัสบรรทัดเดียวที่ส่งคืนชื่อไฟล์เท่านั้นและลบชื่อส่วนขยาย:

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

มันจะพิมพ์

logo

ที่มา: ลบนามสกุลและส่งคืนเฉพาะชื่อไฟล์ใน PHP


4

@fire ในกรณีที่ชื่อไฟล์ใช้จุดคุณอาจได้ผลลัพธ์ผิดพลาด ฉันจะใช้วิธี @Gordon แต่รับส่วนขยายด้วยดังนั้นฟังก์ชั่น basename ทำงานได้กับส่วนขยายทั้งหมดเช่นนี้

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

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

4

ในกรณีของฉันฉันใช้ด้านล่าง ฉันไม่สนใจสิ่งที่เป็นส่วนขยาย : D ฉันคิดว่ามันจะช่วยคุณ

$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: คุณพิมพ์ผิด$extenion
โทมัส Kekeisen

2

คุณสามารถเขียนสิ่งนี้

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

สิ่งเหล่านี้จะคืนองค์ประกอบปัจจุบันของอาร์เรย์หากไม่ได้ใช้มาก่อน


สวัสดีโปรดตรวจสอบก่อนที่จะทำการลดระดับ มันใช้งานได้ฉันใช้มันในรหัสของฉันหลายครั้ง โดยใช้ฟังก์ชั่นนี้คุณจะได้รับเพียงชื่อไฟล์หากคุณชื่อไฟล์คือ "xyz.jpg" อาจไม่ทำงานกับชื่อไฟล์ที่มีทั้งพา ธ ในนั้น
Jitendra Pawar

สิ่งนี้ยังทำงานไม่ถูกต้องหากชื่อไฟล์มีจุดหลายจุดเช่น "some.interesting.image.jpg"
ganzpopp

2

สั้น

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

ดี. แต่ถ้าฉันใส่รหัสข้างต้นในb.phpและฉันดำเนินการมีa.php require('b.php')จากนั้นผลลัพธ์จะเป็นอย่างไรbแทนa
Rohan Khude

1

ชื่อไฟล์ที่ไม่มีนามสกุลไฟล์เมื่อคุณไม่รู้นามสกุล:

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


2
ถ้านามสกุลเป็นอะไรเช่น. tar.gz
Arda

1

หากคุณไม่ทราบว่าคุณมีส่วนขยายใดคุณสามารถลองทำสิ่งนี้:

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

การทำงานกับความเป็นไปได้ทั้งหมด:

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

1

คำตอบของคุณอยู่ด้านล่างโซลูชันที่สมบูรณ์แบบเพื่อซ่อนไฟล์นามสกุลใน php

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

1

การแก้ปัญหาที่มีอยู่ล้มเหลวเมื่อมีหลายส่วนในการขยาย ฟังก์ชั่นด้านล่างใช้งานได้หลายส่วนเส้นทางแบบเต็มหรือเพียงแค่ชื่อไฟล์ aa:

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

ส่งคืนชื่อไฟล์เท่านั้นโดยไม่มีส่วนขยายใด ๆ ใน 1 แถว:

$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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.