Як видалити розширення з рядка (тільки реальне розширення!)


135

Я шукаю невелику функцію, яка дозволяє мені видалити розширення з імені файлу.

Я знайшов багато прикладів за допомогою googling, але вони погані, оскільки вони просто видаляють частину рядка за допомогою "". . Вони використовують крапку для обмежувача і просто вирізають рядок.

Подивіться на ці сценарії,

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

або

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

Коли ми додаємо рядок так:

Це приклад деякої нитки

Він поверне лише "Це" ...

Розширення може містити 3 або 4 символи, тому ми повинні перевірити, чи крапка знаходиться на 4 або 5 позиції, а потім видалити її.

Як це можна зробити?


1
Що таке "справжнє" розширення? Ви хочете видалити останні 4 чи менше символів, якщо вони передують крапкою?
Клайф

"Полковник Шрапнель" - розроблений для користувачів Windows. "clyfe" - так, я хочу видалити все після крапки, але тільки якщо він знаходиться на 4 або 5 позиції, що буде представляти ".jpeg" або ".mp3". Я просто не хочу його видалити. Я знаю, що я можу це зробити вручну, використовуючи str-pos і вирізати рядок, використовуючи if (якщо 5 pos = точка, то вирізати (rtrim) з правого 5 символів, якщо 4 pos = точка, то rtrim 4, інакше повернутись без будь-яких змін. Але може бути , це швидше рішення.
Марк

3
Що з файлами .package? Або. Єдність? Здається трохи довільним, щоб обмежити розширення на 4 символи.
rdb

Відповіді:


172

Спробуйте це:

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

Отже, це відповідає крапці, за якою слідують три чи чотири символи, які не є крапкою чи пробілом. Правило "3 або 4", ймовірно, має бути полегшеним, оскільки є безліч розширень файлів, які коротші або довші.


проблема полягає в тому, що також є люди, які перейменовують файли на кшталт:20120720.something.somethingelse.jpg
Obmerk Kronen

3
Я не думаю, що це буде працювати з файлами з двома символами як розширення
NaturalBornCamper

1
ти! зауважте, що вам слід використовувати одинарні лапки, якщо ви не здійснюєте заміну змінних, наприклад"$var"
aelgoa

ну, щоб використовувати його з .py файлами, я думаю, вам доведеться додати 2,3,4 замість просто 3,4:> спасибі!
voghDev

2
@voghDev для підтримки розширень з 2 до 4 символів, які слід додати {2,4}замість{3,4}
Timo Huovinen


81

З посібника, довідкова інформація :

<?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 ['ім'я файлу"] "від T.sec -" xxx "23 12 32 3 a twym2 Він поверне лише T. З наведеного вище прикладу нічого не слід видаляти!
Марк

56

Використовувати базову назву PHP ()

(PHP 4, PHP 5)

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

Виходи: рядок (4) "тест"


2
+1 Якщо згадані вимоги до розширення не були суворими, це буде ідеальною відповіддю.
Кайла

1
Переглядаючи комісії на php.net , є ідея щодо роботи з масивом ... що, на мою думку, можна було б покращити, використовуючи щось таке, як прогулянка з масиву
CrandellWS

35

Це досить просте рішення, і воно буде працювати незалежно від того, як довго буде розширення або скільки крапок або інших символів у рядку.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

В основному це просто шукає останнє виникнення. а потім використовує підрядку для отримання всіх символів до цього моменту.

Це схоже на один із ваших Google прикладів, але простіший, швидший та простіший, ніж звичайні вирази та інші приклади. Ну імо все одно. Сподіваюся, це комусь допоможе.


2
Я знаю, що це надто пізно, але я думаю, що це найкраща відповідь. Чудово працює.
Агбогіді Майкл

це не працюватиме для * nix прихованих файлів без розширення, наприклад,.htaccess
Fr0zenFyr

12

Ви можете використовувати те, що PHP вбудовано, щоб допомогти ...

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

Хоча якщо ви маєте справу лише з ім'ям файлу ( .somefile.jpg), ви отримаєте ...

./somefile

Дивіться це на CodePad.org

Або скористайтеся регулярним виразом ...

$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
Тимо Хуовінен

5

У Google я знайшов багато прикладів, але є погані, оскільки просто видаліть частину рядка за допомогою "".

Насправді це абсолютно правильно. Ідіть і використовуйте це.

Розширення файлу - це все після останньої крапки, і для розширення файлу немає жодної конкретної кількості символів. Навіть кажучи лише про Windows, він уже поставляється з розширеннями файлів, які не відповідають 3-4 символам, наприклад, наприклад. .manifest.


2
.. і не будемо забувати .htaccessі .htpasswdв апаш-середовищах.
h2ooooooo

5

Рекомендую використовувати: pathinfo с PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

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

Використовуй це:

strstr('filename.ext','.',true);
//result filename

Це працює лише в тому випадку, якщо в імені файлу вже немає періоду. Документи PHP згадують про перше виникнення голки
переверніть

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

EDIT : Найрозумніший підхід IMHO, він видаляє останню точку та наступний текст з імені файлу (він же розширення):

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

Ура;)


Хоча це може працювати, end()не повинно працювати з функцією, переданою як параметр. Він також
надсилає

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.