Удалить расширение файла php

PHP, получить имя файла без расширения файла

Если у меня есть файл с именем my.zip , эта функция возвращает .zip . Я хочу сделать обратное, я хочу, чтобы функция возвращала my без расширения. Файл представляет собой просто строку в переменной.

17 ответов

Не нужно этого. Проверьте pathinfo(), он предоставит вам все компоненты вашего пути. Пример из руководства:

$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"; // filename is only since PHP 5.2.0 
/www/htdocs index.html html index 
echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html 

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

К сожалению, они ошибочно назвали «базовое имя», поскольку оно возвращает полное имя файла с расширением, а не базовое имя.

В качестве альтернативы pathinfo() вы можете использовать

Пример из руководства PHP

$path = "/home/httpd/html/index.php"; $file = basename($path); // $file is set to "index.php" $file = basename($path, ".php"); // $file is set to "index" 

Вы должны знать расширение, чтобы удалить его заранее, хотя.

Однако, поскольку ваш вопрос подсказывает, что вам нужно получить расширение и базовое имя, я бы голосовал Pekka answer как самый полезный, потому что он будет предоставить вам любую информацию, которую вы хотите о пути и файле, с одной единственной встроенной функцией.

Что делать, если я не знаю о расширении файла .. скажем, если путь является динамическим, любой тип расширения файла может войти в него! тогда что ??

@user889030 user889030, тогда у вас другой сценарий, отличный от OP, и вы не используете basename , но pathinfo как показано в другом месте на странице.

pathinfo($path, PATHINFO_FILENAME); 

@user966939 user966939, чувак, расширения вообще нет. Это PATHINFO_FILENAME , а не PATHINFO_EXTENSION .

Кто бы ни решил, что у filename нет расширения, в то время как у basename есть некоторые садистские тенденции .

Другой подход заключается в использовании регулярных выражений.

$fileName = basename($filePath); $fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName); 

Это удаляет из последнего периода . до конца строки.

Гораздо лучше, чем использование explode, и перехватывает только последний период, если вы использовали периоды в именах файлов

Спасибо, и вышеупомянутые комментарии прибили это. Отсутствие необходимости знать расширение делает это более полезным.

@caiosm1005 caiosm1005, поверхность атаки сразу увеличивается, потому что трудно рассуждать о внутренностях движка регулярных выражений. Например, в приведенном выше коде не было бы странно, если бы был некоторый входной $fileName который мог бы заставить двигатель работать в экспоненциальном (или худшем) времени. И, предполагая, что мы закончили анализ внутренних элементов этого конкретного механизма регулярных выражений и теоретически доказали, что он устойчив к любым возможным значениям, $fileName может иметь $fileName , код все еще не может быть произвольно переносим на другую платформу, которая имеет другую реализацию механизма регулярных выражений.

@Pacerier Я должен не согласиться. Во-первых, это очень простое регулярное выражение; Я просто не вижу, как время обработки может увеличиться в геометрической прогрессии. Во-вторых, в этом выражении нет специальных подстановочных знаков, поэтому он должен быть в состоянии выполнить то же самое в любой реализации регулярного выражения.

Если расширение неизвестно, используйте это решение

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname" pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname" 

Пожалуйста, предоставьте pathinfo на страницу руководства php для pathinfo . Это поможет OP ShowFileExtension метод ShowFileExtension и обеспечит дополнительное чтение для всех, кто пытается найти этот ответ. Также немного описания не сбилось бы с пути .

@yckart true, но это дает несколько примеров в ответе. У вас есть возможность ссылки на ideone.com, но сайт может отключиться.

@Bordon basename будет работать нормально, если вы знаете расширение, если вы не можете использовать explode:

$filename = end(explode(".", $file)); 

Пожалуйста, направляйте мне комментарии с помощью функции комментариев под моим ответом. Наиболее подходящей функцией для этого является pathinfo , поэтому я дал basename в качестве альтернативы. Там нет необходимости заново pathinfo с регулярным выражением или explode .

@fire, твое обновление не имеет смысла. end(explode(«.», $file)); дает вам расширение, а не имя файла.

Почти все вышеупомянутое решение имеет показанное получение имени файла из переменной $path

Ниже фрагмента будет получить текущее имя исполняемого файла без расширения

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME); 

$_ SERVER [‘SCRIPT_NAME’] содержит путь к текущему script.

Источник

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

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

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

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

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

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

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

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

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

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

Это не должен быть полный путь для правильной работы. Он будет так же радостно проанализировать file.jpg как /path/to/my/file.jpg .

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

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

$filename = "abc.def.jpg"; $newFileName = substr($filename, 0 , (strrpos($filename, "."))); //$newFileName will now be abc.def 

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

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

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

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

Вы можете использовать встроенный PHP, чтобы помочь …

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

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

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

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

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

$withoutExt = pathinfo($path, PATHINFO_FILENAME); 

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

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

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

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

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' 

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

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

Как отмечают другие, идея ограничения расширения на некоторое количество символов недопустима. Идя с идеей array_pop, думая о разделительной строке как массиве, эта функция мне полезна …

function string_pop($string, $delimiter)
$filename = "pic.of.my.house.jpeg"; $name = string_pop($filename, '.'); echo $name; 
pic.of.my.house (note it leaves valid, non-extension "." characters alone) 

Источник

Как отрезать расширение у названия файла на PHP

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

  1. Отрезать разрешение файла с помощью регуляргого выражения.
  2. С помощью строковых функций.
  3. С помощью функции разбора пути pathinfo() .
//Задаём переменной $nametest строку с полным именем файла $nametest = "../test/file/namefile.txt"; //Или как вариант с URL $nametest = "http://it.test2.ru/12345"; //Отрезаем разрешение файла с помощью регулярного выражения echo preg_replace('/.[^./]+$/', '', $nametest); //С помощью строковых функций echo substr($nametest, 0, strrpos($nametest,'.')); //С помощью функции pathinfo() echo pathinfo($nametest, PATHINFO_FILENAME);

Как видно из результатов теста первые два варианта только удаляют само разрешение файла, в то время как вариант с функцией разбора URL отдаёт только само название файла без его разрешения. Следует отмерить, что решение с регулярными выражениями более ресурсоёмкое и лучше выбрать комбинацию строковых функций, но она плохо работает в URL. Если же нужено получить только имя файла из URL — это конечно последний вариант с функцией разбора пути pathinfo() .

Дата публикации: 2023-03-04

Источник

Читайте также:  Action home index module php
Оцените статью