Это вопрос, который вы можете прочитать повсюду в Интернете с различными ответами:
$ ext = end (explode ('.', $ filename)); $ ext = substr (strrchr ($ filename, '.'), 1); $ ext = substr ($ filename, strrpos ($ filename, '.') + 1); $ ext = preg_replace ('/^.* . ([^.] +) $/D ',' $ 1 ', $ filename); $ exts = split ("[/\.]", $ Filename); $ n = count ($ exts) -1; $ ext = $ exts [$ n];
и т. д.
Однако всегда есть «лучший способ», и он должен быть в стеке Переполнение.
Люди из других языков сценариев всегда думают, что их язык лучше, потому что у них есть встроенная функция для этого, а не PHP (я сейчас смотрю на Pythonistas: – )).
На самом деле он существует, но мало кто его знает. Встречайте pathinfo ()
:
$ ext = pathinfo ($ filename, PATHINFO_EXTENSION);
Это быстро и встроено. pathinfo ()
может предоставить вам другую информацию, например канонический путь, в зависимости от константы, которую вы ему передаете.
Помните, что если вы хотите иметь возможность для работы с символами, отличными от ASCII, сначала необходимо установить языковой стандарт. Например:
setlocale (LC_ALL, 'en_US.UTF-8');
Также обратите внимание, что это не требует принимая во внимание содержимое файла или mime-тип, вы получаете только расширение. Но это то, о чем вы просили.
Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути к ресурсам URL, который покрывается с помощью PARSE_URL.
Наслаждайтесь
pathinfo ( )
$ path_info = pathinfo ('/foo/bar/baz.bill'); echo $ path_info ['extension']; //"счет"
-
14Начиная с PHP 5.5 ->
echo pathinfo ('/foo/ бар/баз. bill ') [' extension '];
– Салман А. 13 сен 2014 в 12:18 -
1Это работает даже на этом уровне (Twitter json): $ ext = pathinfo ($ result-> extended_entities -> медиа [0] -> video_info-> варианты [1] -> url, PATHINFO_EXTENSION); – KJS 04 дек. ’16 в 1:01
pathinfo()
$ path_info = pathinfo ('/foo/bar/baz.bill'); echo $ path_info ['extension']; //"счет"
Пример URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
A) Не используйте предложенный небезопасный PATHINFO:
pathinfo ($ url) ['dirname'] 🡺 'http://example.com/myfolder'pathinfo($url)['basename'] 🡺 'sympony.mp3? a = 1 & b = 2 # XYZ' //
B) Используйте PARSE_URL:
parse_url ($ url) [ 'scheme'] 🡺 'http'parse_url ($ url) [' host '] 🡺' example.com'parse_url ($ url) ['path'] 🡺 '/myfolder/sympony.mp3'parse_url ($ url) [' query '] 🡺' aa = 1 & bb = 2'parse_url ($ url) ['fragment'] 🡺 'XYZ'
БОНУС: просмотр всех нативных примеров PHP
-
3Этот ответ охватывает все, например. файл типа
foo_folder/foo-file.jpg? 1345838509
потерпит неудачу с помощью всего лишьpathinfo
, thanx – user1299518, 20 июля 2015 г., 06:46 -
1Не совсем по теме, но это решило мою проблему! – Хауи, 24 ноя. 2015, в 18:48
-
11Ничего не забывайте!
parse_url
– для URL, аpathinfo
– для пути к файлу. – Наби К.А.З.. 09 июня ’17 в 6:02 -
1Что значит “забыть информацию о пути”? Вы используете его в решении! – Осенний Леонард, 20 июня ’17 в 14:12
-
2@AutumnLeonard Он этого не делает, он просто показал различия между pathinfo и parse_url. – user443346, 29 авг. ’17 в 09:52
Пример URL: http: //example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
A) Не используйте предложенные небезопасные PATHINFO
:
pathinfo ($ url) ['dirname'] 🡺 'http ://example.com/myfolder'pathinfo ($ url) ['basename'] 🡺 'sympony.mp3? a = 1 & b = 2 # XYZ'//
B) Используйте PARSE_URL:
parse_url ($ url) ['scheme'] 🡺 'http'parse_url ($ url) [' host ' ] 🡺 'example.com'parse_url ($ url) [' path '] 🡺'/myfolder/sympony.mp3'parse_url($url)['query '] 🡺' aa = 1 & bb = 2'parse_url ($ url) [ 'фрагмент'] 🡺 'XYZ'
БОНУС: просмотр всех нативных примеров PHP
Также есть SplFileInfo
:
$ file = new SplFileInfo ($ path); $ ext = $ file-> getExtension ();
Часто вы можете написать лучший код, если вы передавать такой объект вместо строки. Тогда ваш код более говорящий. Начиная с PHP 5.4 это однострочник:
$ ext = (new SplFileInfo ($ path)) -> getExtension ();
-
Фантастика, его объекты полностью вниз 🙂 – Кристофер Чейз, 26 июня 2013 г., 15:12
-
2Имейте в виду, что
-> getExtension ()
доступен в SplFileInfo, начиная с PHP 5. 3,6. – маттиас 26 авг. ’14 в 12:02 -
1@matthias: Имейте в виду, что SPL можно отключить в версиях PHP, предшествующих выпуску PHP 5.3.0. Если вы все еще не используете PHP 5.3, но 5.2 или ниже, этот ответ, скорее всего, не подходит для стабильного кода. В противном случае вы можете стабилизировать свой код, потребовав конкретную версию PHP, и в противном случае выйти из строя. – hakre 26 авг. 2014, 12:24
-
@hakre Хотя вы правы, сказав, что “можно отключить в версиях, предшествующих 5.3.0”, расширение SPL, тем не менее, компилируется по умолчанию, начиная с PHP 5.0.0. Так что этот комментарий действительно имеет смысл для людей, вынужденных использовать PHP 5.2 или ниже и не желающих отказываться от использования определенных классов SPL. – маттиас 26 авг. ’14 в 12:35
-
да, просто мертвая версия болтовни 🙂 – hakre 26 авг., 13:02
Также есть SplFileInfo
:
$ file = new SplFileInfo ($ path); $ ext = $ file-> getExtension ();
Часто можно напишите лучший код, если вы передадите такой объект вместо строки. Тогда ваш код более говорящий. Начиная с PHP 5.4 это однострочник:
$ ext = (new SplFileInfo ($ path)) -> getExtension ();
Ответ E-satis – это правильный способ определить файл extension.
В качестве альтернативы, вместо того, чтобы полагаться на расширение файлов, вы можете использовать fileinfo для определения MIME-типа файлов.
Вот упрощенный пример обработки изображения загружено пользователем:
//Код предполагает, что необходимые расширения установлены и успешная загрузка файла уже произошла//Создайте объект FileInfo $ finfo = new FileInfo (null, ' /path/to/magic/file ');//Определяем MIME-тип загруженного файлового переключателя ($ finfo-> file ($ _ FILES [' image '] [' tmp_name '], FILEINFO_MIME)) {case' image/jpg ': $ im = imagecreatefromjpeg ($ _ ФАЙЛЫ [' изображение '] [' tmp_name ']); сломать; case 'image/png': $ im = imagecreatefrompng ($ _ FILES ['image'] ['tmp_name']); сломать; case 'image/gif': $ im = imagecreatefromgif ($ _ FILES ['image'] ['tmp_name']); break;}
-
1Это ЕДИНСТВЕННЫЙ правильный ответ. Я не понимаю, почему люди голосовали за других. Да, этот подход требует от разработчика больших усилий, но повышает производительность (хотя и немного, но дает). Пожалуйста, обратитесь к этому. – Бхавик Шах, 31 янв. 2014, в 07:43
-
3@Bhavik: В некоторых случаях нам может понадобиться только расширение файла, они касаются проверки типа mime. Но на самом деле вопрос касается расширения файла, а не типа файла. Так что это НЕ лучший ответ на этот вопрос. (пока что ответ) – Саси варна кумар 23 окт. ’15 в 8:25
Ответ E-satis – это правильный способ определить расширение файла.
В качестве альтернативы, вместо того, чтобы полагаться на в расширении файлов вы можете использовать fileinfo для определения MIME-типа файлов.
Вот упрощенный пример обработки изображения, загруженного пользователем:
//Код предполагает, что необходимые расширения установлены и успешная загрузка файла уже произошла//Создание объекта FileInfo $ finfo = new FileInfo (null, '/path/to/magic/file');//Определение MIME тип загруженного файлового переключателя ($ finfo-> file ($ _ FILES ['image'] ['tmp_name'], FILEINFO_MIME)) {case 'image/jpg': $ im = imagecreatefromjpeg ($ _ FILES ['image'] [' tmp_name ']); сломать; case 'image/png': $ im = imagecreatefrompng ($ _ FILES ['image'] ['tmp_name']); сломать; case 'image/gif': $ im = imagecreatefromgif ($ _ FILES ['image'] ['tmp_name']); break;}
Если он не содержит пути, вы также можете использовать:
array_pop (explode ('.', $ Fname))
Где $ fname
– имя файла, например: my_picture.jpg
. И результат будет: jpg
-
@ Почему у него 3 отрицательных голоса? это дает правильный результат. Пожалуйста, объясните – railsbox 22 мая ’14 в 06:23
-
Это не неправильно, просто это не лучший способ сделать это. Проголосовали за немного баланса. – user622327 15 июля ’14, в 1:52
-
Это лучший способ, когда вам нужно настоящее расширение, а имя файла может содержать несколько., например, загруженные пользователем фотографии в моем случае. – Rauli Rajande, 21 июл. 2014, 15:35
-
3Ошибка, если имя файла не имеет расширения. Попробуйте передать «myfile», и он вернет «myfile». Правильное возвращаемое значение – это пустая строка в качестве расширения в этом случае использования. – pmont 05 дек. ’14 в 17:25
-
1Это неверно, потому что array_pop () выдаст уведомление, потому что он принимает указатель в качестве своего параметра. – jurchiks 31 июл. ’15 в 12:50
Пока он не содержит пути, вы также можете использовать:
array_pop (explode ('.', $ fname))
Где $ fname
– это имя файла, например: my_picture.jpg
. И результат будет: jpg
1) Если вы используете (PHP 5> = 5.3.6) можно использовать SplFileInfo :: getExtension – Получает расширение файла
Пример кода
php $ info = new SplFileInfo ('test.png'); var_dump ($ info-> getExtension ()); $ info = new SplFileInfo ('test.tar.gz'); var_dump ($ info-> getExtension ()) ;?>
Будет выведено
строка (3) "png" строка (2) "gz"
2) Другой способ получить расширение, если вы используете (PHP 4> = 4.0.3, PHP 5) это
Пример кода
php $ ext = pathinfo ('test.png', PATHINFO_EXTENSION); var_dump ($ ext); $ ext = pathinfo ('test.tar. gz ', PATHINFO_EXTENSION); var_dump ($ ext);?>
Это выведет
string (3) "png "string (2)" gz "
//РЕДАКТИРОВАТЬ: удалили скобку
1) Если вы используете (PHP 5> = 5.3.6 ) вы можете использовать SplFileInfo :: getExtension – Получает расширение файла
Пример кода
php $ info = new SplFileInfo ('test.png'); var_dump ($ info-> getExtension ()); $ info = new SplFileInfo ('test.tar.gz'); var_dump ($ info-> getExtension ());?>
Будет выведено
строка (3) «png» строка (2) «gz»
2) Другой способ получить расширение, если вы используете (PHP 4> = 4.0.3, PHP 5 ) – это
Пример кода
php $ ext = pathinfo (' test.png ', PATHINFO_EXTENSION); var_dump ($ ext); $ ext = pathinfo (' test.tar.gz ', PATHINFO_EXTENSION); var_dump ($ ext);?>
Это выведет
string (3) "png" string (2) "gz"
//EDIT: удалено скобка
Иногда полезно не используйте pathinfo ($ path, PATHINFO_EXTENSION)
. Например:
$ path = '/path/to/file.tar.gz';echo ltrim (strstr ($ path,'. '),'. ') ; //tar.gzecho pathinfo ($ path, PATHINFO_EXTENSION); //gz
Также обратите внимание, что pathinfo
не может обрабатывать некоторые символы, отличные от ASCII (обычно он просто подавляет их из вывода). В расширениях это обычно не проблема, но не помешает знать об этом предостережении.
-
6@ e-satis: Согласно Википедии, это два расширения : UNIX-подобные файловые системы используют другую модель без отдельных метаданных расширений. Точка – это просто еще один символ в главном имени файла, а имена файлов могут иметь несколько расширений, обычно представляющих вложенные преобразования, такие как files.tar.gz . – Аликс Аксель 01 нояб., 23:29
-
1А если в названии товара стоит точка? Пример:
test.19-02-2014.jpeg
– Марио Радоманана, 26 марта 2014 г., в 14:05 -
1Это не сработает с/root/my.folder/my.css
ltrim (strrchr ( $ PATH, '.'), '.')
работает как pathinfo, но без токенизации всего. – Рэй Фосс 09 сен 2016 в 13:46
Иногда полезно не использовать pathinfo ($ path, PATHINFO_EXTENSION)
. Например:
$ path = '/path/to/file.tar.gz';echo ltrim (strstr ($ path,'. '),'. ') ; //tar.gzecho pathinfo ($ path, PATHINFO_EXTENSION); //gz
Также обратите внимание, что pathinfo
не может обрабатывать некоторые символы, отличные от ASCII (обычно он просто подавляет их из вывода). В расширениях это обычно не проблема, но не помешает знать об этом предостережении.
Вы также можете попробовать это (работает на PHP 5. * и 7):
$ info = новый SplFileInfo ('test.zip'); echo $ info-> getExtension (); //----- Вывод -----> zip
Совет: он возвращает пустую строку, если файл не имеет расширения
Вы также можете попробовать это (работает на PHP 5. * и 7):
$ info = new SplFileInfo ('test. zip '); echo $ info-> getExtension (); //----- Вывод -----> zip
Совет: он возвращает пустую строку, если файл не имеет расширения
Самый простой способ получить расширение файла в PHP – использовать PHP встроенная функция pathinfo.
$ file_ext = pathinfo ('your_file_name_here', PATHINFO_EXTENSION); echo ($ file_ext); //Вывод должен быть расширением файла, например png, gif или html
Самый простой способ получить расширение файла в PHP – использовать встроенную функцию PHP pathinfo.
$ file_ext = pathinfo ('ваше_имя_файла_здесь', PATHINFO_EXTENSION); echo ($ file_ext); //Вывод должен быть расширением файла, например png, gif или html
Извините … «Короткий вопрос; но НЕ короткий ответ»
Пример 1 для PATH
$ path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";$name = pathinfo ($ path , PATHINFO_FILENAME); $ ext = pathinfo ($ path, PATHINFO_EXTENSION); printf ('
Имя:% s
Расширение:% s', $ name, $ ext);
Пример 2 для URL
$ url = "//www.example.com/dir/file.bak.php ? Что-то + неверно = привет "; $ url = parse_url ($ url); $ name = pathinfo ($ url ['path'], PATHINFO_FILENAME); $ ext = pathinfo ($ url ['path'], PATHINFO_EXTENSION) ; printf ('
Имя:% s
Расширение:% s', $ name, $ ext);
Вывод примера 1:
Имя: base.minExtension: css
Вывод примера 2:
Имя: file.bakExtension: php
Ссылки
-
https://www.php.net/manual/en/function.pathinfo.php
-
https://www.php .net/manual/en/function.realpath.php
-
https://www.php.net/manual/en/function.parse-url. php
Извините … «Короткий вопрос; но НЕ короткий ответ»
Пример 1 для PATH
$ path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";$ name = pathinfo ($ path, PATHINFO_FILENAME); $ ext = pathinfo ($ path, PATHINFO_EXTENSION); printf ('
Имя:% s
Расширение:% s', $ name, $ ext);
Пример 2 для URL
$ url = "//www.example.com/dir /file.bak.php?Something+is+wrong=hello";$url = parse_url ($ url); $ name = pathinfo ($ url ['path'], PATHINFO_FILENAME); $ ext = pathinfo ($ url [' path '], PATHINFO_EXTENSION); printf ('
Имя:% s
Расширение:% s ', $ name, $ ext);
Вывод примера 1 :
Имя: base.minExtension: css
Вывод примера 2:
Имя: file.bakExtension: php
Ссылки
-
https://www. php.net/manual/en/function.pathinfo.php
-
https://www.php.net/manua l/en/function.realpath.php
-
https://www.php.net/manual/en/function.parse-url.php
Сделать это быстрее.
Низкоуровневые вызовы должны быть очень быстрыми , поэтому я подумал, что стоит провести некоторое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, с несколькими запусками каждый), вот несколько разумных:
function method1 ($ s) {return preg_replace ("/ . * ./"," ", $ s);}//проблема крайнего случая function method2 ($ s) {preg_match ("/.([^.pting+)$/",$ s, $ a) ; return $ a [1];} функция method3 ($ s) {$ n = strrpos ($ s, "."); if ($ n === false) return ""; return substr ($ s, $ n + 1);} function method4 ($ s) {$ a = explode (".", $ s); $ n = count ($ а); if ($ n == 1) return ""; return $ a [$ n-1];} function method5 ($ s) {return pathinfo ($ s, PATHINFO_EXTENSION);}
Результаты не сильно удивили. Плохой pathinfo
(безусловно!) Самый медленный; даже с параметром PATHINFO_EXTENSION
, похоже, он пытается разобрать все это целиком, а затем отбросить все ненужные части. С другой стороны, встроенная функция strrpos
почти точно разработана для этой работы, не требует обходных путей, поэтому неудивительно, что она работает намного лучше, чем другие кандидаты:
Исходное имя файла было: something.that.contains.dots.txt Выполнено 50 проходов с 10000 итераций каждый Минимальное измеренное время на проход: Метод 1: 312.6 mike (response: txt)//preg_replace Метод 2: 472.9 mike (response: txt)//preg_match Метод 3: 167.8 mike (response: txt)//strrpos Метод 4: 340.3 mike (response: txt)//Explode Метод 5: 2311.1 mike (response: txt)//pathinfo
ПРИМЕЧАНИЕ: первый метод имеет побочный эффект: он возвращает полное имя, когда нет расширения. Конечно, было бы бессмысленно измерять его с помощью дополнительных strpos, чтобы избежать такого поведения.
Заключение
Кажется, это Путь Самурая :
function fileExtension ($ s) {$ n = strrpos ($ s, "."); return ($ n === false)? "": substr ($ s, $ n + 1);}
Делайте это быстрее.
Вызовы низкого уровня должны быть очень быстрыми Итак, я подумал, что стоит провести небольшое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, с несколькими запусками каждый), вот несколько разумных:
function method1 ($ s) {return preg_replace ("/ . * ./"," ", $ s);}//проблема крайнего случая function method2 ($ s) {preg_match ("/.([^.pting+)$/",$ s, $ a) ; return $ a [1];} функция method3 ($ s) {$ n = strrpos ($ s, "."); if ($ n === false) return ""; return substr ($ s, $ n + 1);} function method4 ($ s) {$ a = explode (".", $ s); $ n = count ($ а); if ($ n == 1) return ""; return $ a [$ n-1];} function method5 ($ s) {return pathinfo ($ s, PATHINFO_EXTENSION);}
Результаты не сильно удивили. Плохой pathinfo
(безусловно!) Самый медленный; даже с параметром PATHINFO_EXTENSION
похоже, что он пытается разобрать все это целиком, а затем отбросить все ненужные части. С другой стороны, встроенная функция strrpos
создана почти точно для этой работы, не требует обходных путей, поэтому неудивительно, что она работает намного лучше, чем другие кандидаты:
Исходное имя файла было: something.that.contains.dots.txt Выполнено 50 проходов с 10000 итераций каждый Минимальное измеренное время на проход: Метод 1: 312.6 mike (response: txt)//preg_replace Метод 2: 472. 9 mike (response: txt)//preg_match Метод 3: 167.8 mike (response: txt)//strrpos Метод 4: 340.3 mike (response: txt)//Explode Метод 5: 2311.1 mike (response: txt)//pathinfo
ПРИМЕЧАНИЕ: первый метод имеет побочный эффект: он возвращает полное имя, когда нет расширения. Конечно, было бы бессмысленно измерять его с помощью дополнительных strpos, чтобы избежать такого поведения.
Заключение
Кажется, это Путь Самурая :
function fileExtension ($ s) {$ n = strrpos ($ s, "."); return ($ n === false)? "": substr ($ s, $ n + 1);}
Вот пример. Предположим, что $ filename – это “example.txt”,
$ ext = substr ($ filename, strrpos ($ filename, '.', -1), strlen ($ filename) );
Итак, $ ext будет “.txt”.
Вот пример. Предположим, что $ filename – это “example.txt”,
$ ext = substr ($ filename, strrpos ($ filename, '.', -1), strlen ($ filename) );
Итак, $ ext будет “.txt”.
pathinfo – это массив. Мы можем проверить имя каталога, имя файла, расширение и т. Д .:
$path_parts = pathinfo ('test.png'); echo $ path_parts ['extension'], " n"; echo $ path_parts ['dirname'], " n"; echo $ path_parts ['basename'], " n"; echo $ path_parts ['filename'], " n";
pathinfo – это массив. Мы можем проверить имя каталога , имя файла, расширение и т. д .:
$path_parts = pathinfo ('test.png'); echo $ path_parts ['extension'], " n "; echo $ path_parts ['dirname']," n "; echo $ path_parts ['basename']," n "; echo $ path_parts ['filename']," n ";
substr ($ путь, strrpos ($ path, '.') + 1);
-
1Это не сработает с/root/my.folder/my.css – Рэй Фосс, 9 сен. : 44
-
1Это должно работают правильно: substr ($ path, strrpos ($ path, ‘.’) + 1); Примечание: этот метод быстрее, чем любые другие решения выше. Попробуйте выполнить тест, используя наш собственный скрипт. – Аббас 17 окт. ’16 в 5: 04
substr ($ path, strrpos ($ path, '.') + 1);
Быстрое исправление будет примерно таким .
//Расчленение файла на основе. operator $ file_ext = explode ('.', $ filename);//Подсчет взятых (если существует более одного. Существуют файлы типа abc.fff.2013.pdf $ file_ext_count = count ($ file_ext);//Минус 1 для получения смещение правильное $ cnt = $ file_ext_count - 1;//Переменная будет иметь значение pdf в соответствии с именем файла примера, упомянутым выше. $ file_extension = $ file_ext [$ cnt];
-
Почему бы просто не использовать php встроенная функция для цели php.net/manual/en/function.pathinfo. php вместо использования длинного кода – Шахбаз 01 июля 2015 г., 17:40
-
1Помимо точки Шахбаза, вы также можете просто сделать
$ file_ext = end (explode ('.', $ filename));
, чтобы сделать все в этом ответ в одной строке вместо четырех. – tvanc, 07 янв., В 2:49 -
@Amelia Что делать, если у вас есть
.tar.gz
. Это не сработает, поэтому, если вам нужно заполнить расширение, используйте, например,ltrim (strstr ($ filename, '.'), '.');
, чтобы вместо этого неправильно заполнить расширение какgz
. – Марин Саговац 21 мая 2016, 20:00
Быстрое исправление будет примерно таким.
//Расчленение файла на основе . operator $ file_ext = explode ('.', $ filename);//Подсчет взятых (если существует более одного. Существуют файлы вроде abc.fff.2013.pdf $ file_ext_count = count ($ file_ext);//Минус 1 для смещение правильное $ cnt = $ file_ext_count - 1;//Переменная будет иметь значение pdf в соответствии с именем файла примера, упомянутым выше. $ file_extension = $ file_ext [$ cnt];
Вы также можете попробовать это:
pathinfo (базовое имя ($ _ FILES ["fileToUpload"] ["name"]), PATHINFO_EXTENSION)
Вы также можете попробовать это:
pathinfo (basename ($ _ FILES [" fileToUpload "] [" имя "]), PATHINFO_EXTENSION)
Я обнаружил, что решения pathinfo ()
и SplFileInfo
хорошо работают для стандартных файлов в локальной файловой системе, но вы могут возникнуть трудности, если вы работаете с удаленными файлами, так как URL-адреса для действительных изображений могут иметь #
(идентификаторы фрагментов) и/или ?
(параметры запроса ) в конце URL-адреса, который оба этих решения (неверно) будут рассматривать как часть расширения файла.
Я обнаружил, что это надежный способ использовать pathinfo ()
в URL-адресе после его первого анализа, чтобы убрать ненужный беспорядок после расширения файла:
$ url_components = parse_url ($ url); //Сначала анализируем URL $ url_path = $ url_components ['path']; //Затем получаем компонент пути $ ext = pathinfo ($ url_path, PATHINFO_EXTENSION); //Затем используйте pathinfo ()
Я обнаружил, что решения pathinfo ()
и SplFileInfo
хорошо работает для стандартных файлов в локальной файловой системе, но вы можете столкнуться с трудностями, если работаете с удаленными файлами, поскольку URL-адреса для допустимых изображений могут иметь #
(идентификаторы фрагментов) и/или ?
(параметры запроса) в конце URL-адреса, который оба этих решения (неверно) будут рассматривать как часть расширения файла.
Я обнаружил, что это было надежный способ использования pathinfo ()
в URL-адресе после его первого анализа, чтобы убрать ненужный беспорядок после расширения файла:
$ url_components = parse_url ($ url); //Сначала анализируем URL $ url_path = $ url_components ['path']; //Затем получаем компонент пути $ ext = pathinfo ($ url_path, PATHINFO_EXTENSION); //Затем используйте pathinfo ()
Используйте substr ($ path, strrpos ($ path, '.') + 1);
. Это самый быстрый метод сравнения.
@Kurt Zhong уже ответил.
Давайте проверим сравнительный результат здесь: https://eval.in/661574
-
Нет. Это не самый быстрый и вас немного удивит, если вы вызовете его с именем файла без расширения. – dkellner 06 авг.2020, в 23:42
Используйте substr ($ path, strrpos ($ path, '.') + 1);
. Это самый быстрый метод сравнения.
@Kurt Zhong уже ответил.
Давайте проверим сравнительный результат здесь: https://eval.in/661574
ltrim (strstr ($ file_url, '.'), '.')
это лучший способ, если у вас есть имена файлов вроде name.name.name.ext (некрасиво, но иногда случается
ltrim (strstr ($ file_url, '.'), '.')
это лучший способ, если у вас есть имена файлов вроде name.name.name.ext (некрасиво, но иногда бывает
Это сработает
$ ext = pathinfo ($ filename, PATHINFO_EXTENSION);
-
Субодх уже дал гораздо более точный ответ на этот вопрос еще в августе. – Ниссе Энгстрём Ян 15 ’15 в 12:18
-
2Это уже предлагалось еще в 2008 году. Отправляйте ответ только в том случае, если у вас есть что-то уникальное и ценное. Избыточный контент только тратит время исследователей и раздувает страницы Stack Overflow. – mickmackusa 28 июн. ’20 в 4:03
Это будет работать
$ ext = pathinfo ($ filename, PATHINFO_EXTENSION);
Вы можете получить все расширения файлов в определенной папке и выполнять операции с определенным расширением файла:
php $ files = glob ("abc/*. * ");//abc - это папка все файлы внутри папки//print_r ($ files);//echo count ($ files); for ($ i = 0; $ i
Вы можете получить все файлы e xtensions в определенной папке и выполнять операции с определенным расширением файла:
php $ files = glob ("abc/*.*"); //abc - это папка все файлы внутри папки//print_r ($ files); //счетчик эхо ($ files); for ($ i = 0; $ i
$ ext = preg_replace ('/^.*.([^.pting+)$/D', '$ 1', $ fileName);
preg_replace подход, мы используем поиск и замену регулярных выражений. В функции preg_replace первый параметр – это шаблон для поиска, второй параметр $ 1 – это ссылка на то, что соответствует первому (. *), А третий параметр – имя файла.
Другой способ, мы также можем используйте strrpos, чтобы найти позицию последнего вхождения ‘.’ в имени файла и увеличить эту позицию на 1, чтобы она взорвала строку из (.)
$ ext = substr ($ fileName, strrpos ($ fileName, '.') + 1);
$ ext = preg_replace ('/^.*.([^.pting+)$/D' , '$ 1', $ fileName);
preg_replace подход, мы используем поиск и замену регулярных выражений. В функции preg_replace первый параметр – это шаблон для поиска, второй параметр $ 1 – это ссылка на то, что соответствует первому (. *), А третий параметр – имя файла..
Другой способ, мы также можем использовать strrpos, чтобы найти позицию последнего вхождения символа ‘.’ в имени файла и увеличить эту позицию на 1, чтобы она взорвала строку из (.)
$ ext = substr ($ fileName, strrpos ($ fileName, '.') + 1);
Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не Не хочу все токенизировать. Многие другие ответы потерпят неудачу с /root/my.folder/my.css
ltrim (strrchr ($ PATH, '.') , '.');
Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не захотите токенизировать все. Многие другие ответы потерпят неудачу с /root/my.folder/my.css
ltrim (strrchr ($ PATH, '.') , '.');
Хотя «лучший способ» спорен, я считаю, что это лучший способ по нескольким причинам:
function getExt ($ path) {$ basename = basename ( $ path); return substr ($ basename, strlen (explode ('.', $ basename) [0]) + 1);}
- Он работает с несколькими частями, чтобы расширение, например,
tar.gz
- Короткий и эффективный код
- Он работает как с именем файла, так и с полным путем
Хотя «лучший способ» спорен, я считаю, что это лучший способ по нескольким причинам:
функция getExt ($ path) {$ basename = basename ($ path); return substr ($ basename, strlen (explode ('.', $ basename) [0]) + 1);}
- Он работает с несколькими частями, чтобы расширение, например,
tar.gz
- Короткий и эффективный код
- Он работает как с именем файла, так и с полным путем
ИМО, это лучший способ, если у вас есть имена файлов, такие как name.name.name. ext (некрасиво, но иногда бывает):
$ ext = explode ('.', $ filename); //Расчленить строку $ my_ext = end ($ ext); //Получаем последнюю запись массива echo $ my_ext;
IMO, это лучший способ, если у вас есть имена файлов, такие как name.name.name.ext (некрасиво, но иногда случается):
$ ext = explode ('.', $ filename); //Расчленить строку $ my_ext = end ($ ext); //Получение последней записи массива echo $ my_ext;
На самом деле, я это искал.
php $ url = 'http://example.com/myfolder/sympony. mp3? a = 1 & b = 2 # XYZ '; $ tmp = @parse_url ($ url) [' path ']; $ ext = pathinfo ($ tmp, PATHINFO_EXTENSION); var_dump ($ ext);
Собственно, я это и искал.
php $ url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';$tmp = @parse_url ($ url) [' путь ']; $ ext = pathinfo ($ tmp, PATHINFO_EXTENSION); var_dump ($ ext);
Я попробовал одно простое решение, которое может помочь кому-то другому получить только имя файла из URL-адреса, имеющего параметры получения
php $ path = "URL-адрес будет здесь "; echo basename (parse_url ($ path) ['path']);?>
Спасибо
Я попробовал одно простое решение, которое может помочь кому-то другому получить только имя файла из URL, имеющего параметры получения
php $ path = "URL будет здесь"; echo basename (parse_url ($ path) ['path']) ;? >
Спасибо
Используйте
str_replace ('.', '', strrchr ($ file_name, '.'))
для быстрого поиска расширения (если вы точно знаете, что у вашего имени оно есть).
Используйте
str_replace ('.', '', strrchr ($ file_name , '.'))
для быстрого получения расширений (если вы точно знаете, что у вашего файла оно есть).
Невозможно запросить URL без расширения файла php после обновления до Ubuntu 14.04
После обновления моего удаленного сервера до Ubuntu 14.04 (Apache 2.4) я не могу использовать свой предыдущий формат, в котором Я мог бы запрашивать URI, не вызывая расширения файлов, вроде того, как страницы вызываются в такой среде, как CodeIgniter.
Когда я вызываю http://example.com/about, я вызываю about.php. Это работало в Ubuntu 12.04, но теперь страница не найдена.
Это все еще работает на моем локальном компьютере, который все еще 12.04, поэтому я не считаю, что это проблема .htaccess, и не верю, что это проблема с файлами, доступными на сайтах. Кроме того, эта версия контролируется с помощью git, поэтому все почти то же самое, за исключением пары Vars, которые вызывают имя сайта и пути к файлам. – ИСПРАВЛЕНИЕ: это проблема .conf, как указано ниже в моем ОБНОВЛЕНИИ.
У меня включен a2enmod (mode_rewrite).
Но чтобы завершить, я буду предоставить файлы htaccess и доступные для сайтов;
/etc/apache2/sites-avaialable/example.net.conf:
SSLEngine на SSLCertificateFile/etc/apache2/ssl/domains/example.net/example.pem SSLCertificateKeyFile/etc/apache2/ssl/domains/example.net/example.key ServerAdmin webmaster @ example .net ServerName example.net DirectoryIndex index.php index.html DocumentRoot/var/www/html/example.net/www/ Параметры FollowSymLinks AllowOverride None Параметры Индексы FollowSymLinks MultiViews AllowOverride None Разрешить, запретить разрешить для всех # Расположение файлов журнала LogLevel warn ErrorLog/var/www/html/example.net/logs/error.log CustomLog/var/www/ html/example.net/logs/access.log вместе # Адрес электронной почты администратора, имя сервера (имя домена) и любые псевдонимы ServerAdmin webmaster@example.net ServerName example.net ServerAlias www.example .net # Индексный файл и корень документа (где находятся общедоступные файлы) DirectoryIndex index.php index.html DocumentRoot/var/www/html/example.net/www/ Параметры FollowSymLinks AllowOverride None Параметры Индексы FollowSymLinks MultiViews AllowOverride None Порядок разрешить, запретить разрешение для всех # Расположение файлов журнала LogLevel warn ErrorLog/var/www/html/example.net/logs /error.log CustomLog/var/www/html/example.net/logs/access.log в сочетании
END example.net.conf
Я должен отметить, что это то же самое на моем локальном компьютере, где вызовы URI без расширений завершаются успешно.
ОБНОВЛЕНИЕ:
У меня есть удалил код из моего файла .htaccess, так как я решил больше не использовать его, поскольку он не нужен и замедляет работу сервера.
В настоящее время у меня есть этот набор в моем файле example.net.conf по адресу нижняя часть обеих (80 и 443) директив VirtualHost:
RewriteEngine на RewriteCond% {REQUEST_FILENAME}! -d RewriteCond% {REQUEST_FILENAME} . php -f RewriteRule ^ (. *) $ 1.php
В некоторой степени это работает. Проблема, с которой я столкнулся, заключается в том, что при переходе к корневому каталогу документа -> example.com теперь отображается только индекс всех файлов и каталогов вместо содержимого.
Проблема заключается в файл .conf (или .htaccess, если вы его используете).
В моем файле .conf было следующее:
Параметры + FollowSymLinks -MultiViews RewriteEngine на RewriteCond% {REQUEST_URI}! -d RewriteCond% {REQUEST_URI} . php -f RewriteRule ^ (. *) $ $ 1.php [L]
Наконец я узнал, что начиная с Apache 2.2 вы должны добавлять DOCUMENT_ROOT. Теперь работает следующее:
Параметры + FollowSymLinks -MultiViews RewriteEngine на RewriteCond% {DOCUMENT_ROOT}% {REQUEST_URI}! -D RewriteCond% {DOCUMENT_ROOT} % {REQUEST_URI} . Php -f RewriteRule ^ (. *) $ $ 1.php [L]
Я создал пример конфигурации, которая может выполнять/testclass/testmethod без. php extension
Для правил перезаписи я следовал рекомендациям codeigniter
Я создал пример конфигурации, которая может выполнять/testclass/testmethod без расширения .php
Что касается правил перезаписи, я следовал рекомендациям codeigniter