Как удалить расширение из строки (только реальное расширение!)


135

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

Я нашел много примеров по поиску в Google, но они плохие, потому что они просто удаляют часть строки с помощью "." , Они используют точку для ограничителя и просто вырезать строку.

Посмотрите на эти сценарии,

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

или

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

Когда мы добавляем строку следующим образом:

Это пример Somestring

Вернется только «Это» ...

Расширение может иметь 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 символов.
августа

Ответы:


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


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. Из приведенного выше примера не следует ничего удалять!
Марк

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

В основном это выглядит только для последнего появления. а затем использует подстроку для извлечения всех символов до этой точки.

Это похоже на один из ваших гугл-примеров, но проще, быстрее и проще, чем регулярные выражения и другие примеры. Ну, в любом случае, имо. Надеюсь, это кому-нибудь поможет.


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

вернет false, если файл не имеет расширения или пуст, если файл.htaccess
Тимо Хуовинен

5

Я нашел много примеров в Google, но есть и плохие, потому что просто удалите часть строки с помощью "."

На самом деле это абсолютно правильно. Идите и используйте это.

Расширение файла - все после последней точки, и для расширения файла не требуется какого-либо определенного количества символов. Даже если говорить только о Windows, он уже поставляется с расширениями файлов, которые не вмещают 3-4 символа, например, например. .manifest,


2
..и давайте не будем забывать .htaccessи .htpasswdв среде Apache.
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 упоминают о первом появлении иглы
relipse

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 ()
Питер Брэнд

0

РЕДАКТИРОВАТЬ : ИМХО самый умный подход, он удаляет последнюю точку и следующий текст из имени файла (иначе расширение):

$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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.