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


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

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

смотреть на эти скрипты,

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

или

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

когда мы добавляем строку вроде этой:

This.is пример somestring

It вернется только "это"...

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

Как это можно сделать?

16 112
php

16 ответов:

попробуй это:

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

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

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

$filename = pathinfo('filename.md.txt', PATHINFO_FILENAME); // returns 'filename.md'

из руководства, 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.

использовать PHP basename ()

(PHP 4, PHP 5)

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

выходы: строка (4)"test"

Это довольно простое решение и будет работать независимо от того сколько времени расширение или сколько точек или других знаков в строке.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

в основном это просто ищет последнее вхождение . а затем использует подстроку, чтобы получить все символы до этой точки.

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

вы можете использовать то, что PHP встроил, чтобы помочь...

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

хотя, если вы имеете дело только с именем файла (.somefile.jpg), вы получите...

./некий-файл

смотрите дальше CodePad.org

или использовать регулярное выражение...

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

смотрите дальше CodePad.org

если у вас нет пути, но только имя файла, это будет работать и будет много пократче...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

смотрите дальше CodePad.org

конечно, они оба просто ищут последний период (.).

следующий код хорошо работает для меня, и это довольно коротко. Он просто разбивает файл на массив, разделенный точками, удаляет последний элемент (который гипотетически является расширением) и снова преобразует массив с точками.

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

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

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

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

есть несколько способов сделать это, но я думаю, что один из более быстрых способов заключается в следующем

// $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 содержит имя файла без расширения

Вы можете установить длину регулярного выражения с помощью {x,y} оператора. {3,4} будет соответствовать, если предыдущие картины происходит 3 или 4 раза.

но я не думаю, что вам это действительно нужно. Что вы будете делать с файлом с именем "This.is"?

как упоминают другие, идея ограничения расширения до определенного количества символов недопустима. Идя с идеей 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

$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

используйте этот:

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

попробуйте использовать этот. он наверняка удалит расширение файла.

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

редактировать: Самый умный подход IMHO, он удаляет последний пункт и следующий текст из имени файла (он же расширение):

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

Ура ;)

это работает, когда есть несколько частей расширения и является одновременно коротким и эффективным:

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