Подтвердить что ты не робот

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

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

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

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

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

или

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

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

Этот пример somestring

Он вернется только "This"...

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

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

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

Ответ 3

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

Ответ 4

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

(PHP 4, PHP 5)

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

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

Ответ 5

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

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

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

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

Ответ 6

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

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

Ответ 7

Вы можете использовать встроенный 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

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

Ответ 8

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

Собственно, это абсолютно правильная вещь. Идем дальше и используем это.

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

ИЗМЕНИТЬ: Самый умный подход IMHO, он удаляет последнюю точку и следующий текст из имени файла (aka extension):

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

Приветствия;)

Ответ 14

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