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

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

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

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

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

или

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

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

Это пример somestring

Он вернется только «Это» …

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

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

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

 $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 

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

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

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

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

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

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

Я нашел много примеров в 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»?

Использовать это:

 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){ $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