วิธีลบส่วนขยายจากสตริง (เฉพาะส่วนขยายจริง!)


135

ฉันกำลังมองหาฟังก์ชั่นเล็ก ๆ ที่ช่วยให้ฉันสามารถลบนามสกุลออกจากชื่อไฟล์ได้

ฉันได้พบตัวอย่างมากมายโดย googling แต่พวกเขาไม่ดีเพราะพวกเขาเพียงแค่ลบส่วนของสตริงด้วย "." . พวกเขาใช้จุดสำหรับตัว จำกัด และตัดสตริง

ดูสคริปต์เหล่านี้

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

หรือ

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

เมื่อเราเพิ่มสตริงเช่นนี้:

นี่คือตัวอย่างของ somestring

จะส่งคืนเฉพาะ "นี่" ...

ส่วนขยายสามารถมี 3 หรือ 4 ตัวอักษรดังนั้นเราจึงต้องตรวจสอบว่าจุดอยู่ในตำแหน่ง 4 หรือ 5 แล้วลบออก

จะทำอย่างไร?


1
ส่วนขยาย "ของจริง" คืออะไร คุณต้องการที่จะลบ 4 หรือไฟล์ล่าสุดหากพวกเขาถูกนำหน้าด้วยจุด?
clyfe

"พ.อ. กระสุน" - มันถูกออกแบบมาสำหรับผู้ใช้ Windows "clyfe" - ใช่ฉันต้องการลบทุกอย่างหลังจากจุด แต่เฉพาะในตำแหน่ง 4 หรือ 5 สิ่งที่จะแสดง ".jpeg" หรือ ".mp3" ฉันแค่ไม่ลบมันออก ฉันรู้ว่าฉันสามารถทำได้ด้วยตนเองโดยใช้ str-pos และ cut string โดยใช้ if if (ถ้า 5 pos = dot แล้ว cut (rtrim) จากขวา 5 ตัวอักษรถ้า 4 pos = dot แล้ว rtrim 4 มิฉะนั้นจะกลับมาโดยไม่มีการดัดแปลงใด ๆ แต่ บางทีมันอาจจะแก้ปัญหาได้เร็วขึ้น.
รายการ MARC

3
สิ่งที่เกี่ยวกับ. ไฟล์แพคเกจ? หรือ. ยูเนี่ยน? ดูเหมือนว่าเป็นการ จำกัด โดยพลการเพื่อ จำกัด ส่วนขยายไว้ที่ 4 อักขระ
rdb

คำตอบ:


172

ลองอันนี้:

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

ดังนั้นนี่ตรงกับจุดตามด้วยอักขระสามหรือสี่ตัวที่ไม่ใช่จุดหรือเว้นวรรค กฎ "3 หรือ 4" น่าจะผ่อนคลายเนื่องจากมีนามสกุลไฟล์จำนวนมากที่สั้นกว่าหรือยาวกว่า


ปัญหาคือมีคนที่เปลี่ยนชื่อไฟล์เช่น:20120720.something.somethingelse.jpg
Obmerk Kronen

3
ฉันไม่คิดว่ามันจะทำงานกับไฟล์ที่มีตัวละครสองตัวเป็นส่วนเสริม
NaturalBornCamper

1
TY! โปรดทราบว่าคุณควรใช้เครื่องหมายคำพูดเดี่ยวถ้าคุณไม่ทำการแทนค่าตัวแปรเช่น"$var"
aelgoa

เพื่อใช้กับไฟล์. py ฉันคิดว่าคุณต้องเพิ่ม 2,3,4 แทนเพียงแค่ 3,4:> ขอบคุณ!
voghDev

2
@voghDev เพื่อสนับสนุนส่วนขยายที่มี 2 ถึง 4 ตัวอักษรที่คุณควรเพิ่ม{2,4}แทน{3,4}
ติโม Huovinen


81

จากคู่มือ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
?>

ไม่จำเป็นต้องเป็นเส้นทางที่สมบูรณ์ในการทำงานอย่างถูกต้อง มันจะมีความสุขเช่นเดียวกับแยกเป็นfile.jpg/path/to/my/file.jpg


ฉันตรวจสอบสิ่งนี้แล้ว ความผิดพลาดเช่นเดียวกับข้างต้น ลองเข้าถึง "$ path_parts ['filename']" จาก T.sec - "xxx" 23 12 32 3 a twym2 มันจะกลับมาเฉพาะ T จากตัวอย่างด้านบนไม่ควรลบอะไรเลย!
รายการ MARC

56

ใช้PHP basename ()

(PHP 4, PHP 5)

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

เอาท์พุท: สตริง (4) "ทดสอบ"


2
+1 หากข้อกำหนดที่กล่าวถึงสำหรับส่วนขยายไม่เข้มงวดนี่เป็นคำตอบที่สมบูรณ์แบบ
Kayla

1
ดูคอมมิชชันที่php.net มีความคิดเกี่ยวกับการทำงานกับอาเรย์ ... ซึ่งฉันคิดว่าน่าจะดีขึ้นเมื่อใช้บางอย่างเช่นอาเรย์ - วอล์ค
CrandellWS

35

นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างง่ายและจะทำงานได้ไม่ว่าส่วนขยายหรือจุดหรือตัวอักษรอื่น ๆ จะอยู่ในสตริงนานเท่าใด

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

โดยทั่วไปนี่แค่มองหาการเกิดขึ้นครั้งสุดท้ายของ จากนั้นใช้สตริงย่อยเพื่อดึงอักขระทั้งหมดจนถึงจุดนั้น

คล้ายกับตัวอย่าง googled ของคุณ แต่ง่ายกว่าเร็วกว่าและง่ายกว่านิพจน์ทั่วไปและตัวอย่างอื่น ๆ IMO กันดีอยู่แล้ว หวังว่าจะช่วยใครซักคน


2
ฉันรู้ว่านี่กำลังจะมาสายเกินไป แต่ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด ใช้งานได้ดี
Agbogidi Michael

สิ่งนี้จะไม่ทำงานสำหรับไฟล์ * ซ่อนห้ามโดยไม่มีส่วนขยายตัวอย่างเช่น.htaccess
Fr0zenFyr

12

คุณสามารถใช้สิ่งที่ PHP สร้างไว้เพื่อช่วยเหลือ ...

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

แม้ว่าคุณจะเพียงจัดการกับชื่อไฟล์ ( .somefile.jpg) คุณจะได้รับ ...

./somefile

ดูได้ที่ CodePad.org

หรือใช้ regex ...

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

ดูได้ที่ CodePad.org

หากคุณไม่มีเส้นทาง แต่เป็นเพียงชื่อไฟล์สิ่งนี้จะทำงานและมีความพยายามมาก ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

ดูได้ที่ CodePad.org

แน่นอนว่าสิ่งเหล่านี้ทั้งคู่มองหาช่วงเวลาสุดท้าย ( .)


ตามที่กล่าวถึงในบรรทัดสุดท้ายของการแก้ปัญหามันจะล้มเหลวสำหรับชื่อไฟล์เช่น.htaccess
Fr0zenFyr

8

รหัสต่อไปนี้ทำงานได้ดีสำหรับฉันและมันค่อนข้างสั้น มันจะแบ่งไฟล์ออกเป็นอาเรย์ที่คั่นด้วยจุดลบองค์ประกอบสุดท้าย (ซึ่งเป็นส่วนขยายที่สมมุติ) และปฏิรูปอาเรย์ด้วยจุดอีกครั้ง

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

จะกลับเท็จถ้าไฟล์ไม่มีส่วนขยายหรือว่างเปล่าถ้าเป็นไฟล์.htaccess
Timo Huovinen

5

ฉันพบตัวอย่างมากมายใน Google แต่มีข้อเสียเพราะเพียงลบส่วนของสตริงด้วย "."

ที่จริงแล้วเป็นสิ่งที่ถูกต้องอย่างแน่นอน ไปข้างหน้าและใช้สิ่งนั้น

นามสกุลไฟล์เป็นทุกอย่างหลังจากจุดสุดท้ายและไม่จำเป็นต้องมีนามสกุลไฟล์เป็นจำนวนอักขระใด ๆ แม้จะพูดถึง Windows เท่านั้น แต่มันมาพร้อมกับนามสกุลไฟล์ที่มีความยาวไม่เกิน 3-4 ตัวอักษรเช่นเช่น .manifest.


2
.. และอย่าลืม.htaccessและ.htpasswdในสภาพแวดล้อม Apache
h2ooooooo


4

มีสองสามวิธีที่จะทำ แต่ฉันคิดว่าหนึ่งในวิธีที่เร็วกว่าคือต่อไปนี้

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

ทางออกก็คือ ฉันไม่ได้ทดสอบมัน แต่ดูเหมือนว่ามันจะทำงานได้หลายช่วงเวลาในชื่อไฟล์

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

นอกจากนี้:

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

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

ในทุกสิ่งเหล่านี้ $nameมีชื่อไฟล์โดยไม่มีนามสกุล


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

เอาท์พุท:

this-is.file.name

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);เพิ่มเพื่อรับส่วนขยายของไฟล์
I_ATE_YOUR_WORK_FILES

2

ดังที่คนอื่น ๆ พูดถึงแนวคิดของการ จำกัด การขยายตัวของจำนวนอักขระที่ไม่ถูกต้อง ด้วยความคิดของ array_pop โดยคิดถึงสตริงที่คั่นด้วยอาร์เรย์ฟังก์ชันนี้มีประโยชน์สำหรับฉัน ...

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

การใช้งาน:

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

ขาออก:

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

ในการดำเนินการ:

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


1

คุณสามารถกำหนดความยาวของรูปแบบนิพจน์ทั่วไปโดยใช้{x,y}โอเปอเรเตอร์{3,4}จะจับคู่หากรูปแบบที่มาก่อนเกิดขึ้น 3 หรือ 4 ครั้ง

แต่ฉันไม่คิดว่าคุณต้องการมันจริงๆ คุณจะทำอะไรกับไฟล์ชื่อ "This.is"?



0

ลองใช้อันนี้ มันจะลบนามสกุลไฟล์อย่างแน่นอน

$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'

คุณสามารถลดสิ่งนี้เป็นหนึ่งบรรทัดด้วย array_pop ()
Peter Brand

0

แก้ไข : วิธีที่ฉลาดที่สุด IMHO มันจะลบจุดสุดท้ายและข้อความต่อไปนี้จากชื่อไฟล์ (หรือที่รู้จักในชื่อนามสกุล):

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

ไชโย;)


แม้ว่ามันจะทำงานได้ แต่end()ก็ไม่ควรที่จะทำงานกับฟังก์ชั่นที่ส่งเป็นพารามิเตอร์ นอกจากนี้ยังสร้างประกาศ: เฉพาะตัวแปรที่ควรส่งผ่านโดยการอ้างอิง
CodeBrauer

0

สิ่งนี้ใช้ได้เมื่อมีหลายส่วนในส่วนขยายและทั้งสั้นและมีประสิทธิภาพ:

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