Как мне получить расширение файла в PHP?

Это вопрос, который вы можете прочитать повсюду в Интернете с различными ответами:

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

Наслаждайтесь


175

pathinfo ( )

  $ path_info = pathinfo ('/foo/bar/baz.bill'); echo $ path_info ['extension']; //"счет"  

Улучшите этот ответ
отредактировал 27 июля ’18 в 9:43
T.Todua
42.9k1616 золотых знаков186186 серебряных знаков174174 бронзовых знака
ответил 06 окт. 2008 в 11:02
  • 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']; //"счет"  

107

Пример 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

Улучшите это ответ
изменен 06 окт. в 13:05
dipenparmar12
82611 золотых знаков77 серебряных знаков2222 бронзовых знака
ответ дан 17 июля ’15 в 15: 39
  • 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
| показать 1 дополнительный комментарий

Пример 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


60

Также есть SplFileInfo :

  $ file = new SplFileInfo ($ path); $ ext = $ file-> getExtension ();  

Часто вы можете написать лучший код, если вы передавать такой объект вместо строки. Тогда ваш код более говорящий. Начиная с PHP 5.4 это однострочник:

  $ ext = (new SplFileInfo ($ path)) -> getExtension ();  

Улучшить этот ответ
отредактировал 8 июля ’19 в 23:17
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 17 окт. ’12 в 10:32
  • Фантастика, его объекты полностью вниз 🙂 — Кристофер Чейз, 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
| показать 1 дополнительный комментарий

Также есть SplFileInfo :

  $ file = new SplFileInfo ($ path); $ ext = $ file-> getExtension ();  

Часто можно напишите лучший код, если вы передадите такой объект вместо строки. Тогда ваш код более говорящий. Начиная с PHP 5.4 это однострочник:

  $ ext = (new SplFileInfo ($ path)) -> getExtension ();  

23

Ответ 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;}  

Улучшите этот ответ
отредактировал 08 июля ’19 в 23:18
Питер Мортенсен
27. 3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 06 окт.’08 в 17: 23
  • 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;}  

20

Если он не содержит пути, вы также можете использовать:

  array_pop (explode ('.', $ Fname))  

Где $ fname — имя файла, например: my_picture.jpg . И результат будет: jpg

Улучшите этот ответ
отредактировал 08 июля ’19 в 23:19
Питер Мортенсен
27. 3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 11 авг. >
  • @ Почему у него 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


12

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 " 

//РЕДАКТИРОВАТЬ: удалили скобку

Улучшите этот ответ
отредактировано 25 ноября ’14 в 13:09
nils
1,5681313 серебряных знаков1515 бронзовых знаков
ответил 02 августа 2014 в 07:52
добавить комментарий |

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: удалено скобка


12

Иногда полезно не используйте pathinfo ($ path, PATHINFO_EXTENSION) . Например:

  $ path = '/path/to/file.tar.gz';echo ltrim (strstr ($ path,'. '),'. ')  ; //tar.gzecho pathinfo ($ path, PATHINFO_EXTENSION); //gz  

Также обратите внимание, что pathinfo не может обрабатывать некоторые символы, отличные от ASCII (обычно он просто подавляет их из вывода). В расширениях это обычно не проблема, но не помешает знать об этом предостережении.

Улучшите этот ответ
отредактировано 8 июля ’19 в 23:20
Питер Мортенсен
27. 3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
1 ноя ’12 в 21: 11
  • 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 (обычно он просто подавляет их из вывода). В расширениях это обычно не проблема, но не помешает знать об этом предостережении.


9

Вы также можете попробовать это (работает на PHP 5. * и 7):

  $ info =  новый SplFileInfo ('test.zip'); echo $ info-> getExtension (); //----- Вывод -----> zip  

Совет: он возвращает пустую строку, если файл не имеет расширения

Улучшите этот ответ
отредактировал 8 июля ’19 в 23 : 25
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 12 фев. 17, 5:40
добавить комментарий |

Вы также можете попробовать это (работает на PHP 5. * и 7):

  $ info = new SplFileInfo ('test. zip '); echo $ info-> getExtension (); //----- Вывод -----> zip  

Совет: он возвращает пустую строку, если файл не имеет расширения


8

Самый простой способ получить расширение файла в PHP — использовать PHP встроенная функция pathinfo.

  $ file_ext = pathinfo ('your_file_name_here', PATHINFO_EXTENSION); echo ($ file_ext); //Вывод должен быть расширением файла, например png, gif или html  

Улучшите этот ответ
отредактировано 8 июля ’19 в 23:21
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 13 мая ’15 в 18:44
добавить комментарий |

Самый простой способ получить расширение файла в PHP — использовать встроенную функцию PHP pathinfo.

   $ file_ext = pathinfo ('ваше_имя_файла_здесь', PATHINFO_EXTENSION); echo ($ file_ext); //Вывод должен быть расширением файла, например png, gif или html  

8

Извините … «Короткий вопрос; но НЕ короткий ответ»

Пример 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  

Ссылки

  1. https://www.php.net/manual/en/function.pathinfo.php

  2. https://www.php .net/manual/en/function.realpath.php

  3. https://www.php.net/manual/en/function.parse-url. php

Улучшите этот ответ
отредактировано 28 июля ’19 в 13:03
ответил 20 июля ’19 в 15:51
добавить комментарий |

Извините … «Короткий вопрос; но НЕ короткий ответ»

Пример 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  

Ссылки

  1. https://www. php.net/manual/en/function.pathinfo.php

  2. https://www.php.net/manua l/en/function.realpath.php

  3. https://www.php.net/manual/en/function.parse-url.php


7

Сделать это быстрее.

Низкоуровневые вызовы должны быть очень быстрыми , поэтому я подумал, что стоит провести некоторое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, с несколькими запусками каждый), вот несколько разумных:

  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);}  

Улучшите этот ответ
отредактировано 9 августа ’20 в 17:59
ответил 7 апр. ’20 в 11:34
добавить комментарий |

Делайте это быстрее.

Вызовы низкого уровня должны быть очень быстрыми Итак, я подумал, что стоит провести небольшое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, с несколькими запусками каждый), вот несколько разумных:

  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);}  

6

Вот пример. Предположим, что $ filename — это «example.txt»,

  $ ext = substr ($ filename, strrpos ($ filename, '.', -1), strlen ($ filename)  );  

Итак, $ ext будет «.txt».

Улучшите этот ответ
отредактировано 8 июля ’19 в 23:23
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 25 февраля 2015 в 23:22
добавить комментарий |

Вот пример. Предположим, что $ filename — это «example.txt»,

  $ ext = substr ($ filename, strrpos ($ filename, '.', -1), strlen ($ filename)  );  

Итак, $ ext будет «.txt».


6

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";  

Улучшите этот ответ
отредактировал 08 июля ’19 в 23:24
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 03 июня ’16 в 16:43
добавить комментарий |

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 ";  

5
путь>

  substr ($  путь, strrpos ($ path, '.') + 1);  

Улучшите этот ответ
ответил 05 дек. 2013 в 11:13
  • 1
    Это не сработает с/root/my.folder/my.css — Рэй Фосс, 9 сен. : 44
  • 1
    Это должно работают правильно: substr ($ path, strrpos ($ path, ‘.’) + 1); Примечание: этот метод быстрее, чем любые другие решения выше. Попробуйте выполнить тест, используя наш собственный скрипт. — Аббас 17 окт. ’16 в 5: 04
добавить комментарий |

  substr ($ path, strrpos ($ path, '.') + 1);  

5

Быстрое исправление будет примерно таким .

 //Расчленение файла на основе.  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];  

Улучшить этот ответ
отредактировал 8 июля ’19 в 23: 22
Питер Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 26 мая ’15 в 9:29
  • Почему бы просто не использовать 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];  

4

Вы также можете попробовать это:

  pathinfo (базовое имя ($ _ FILES ["fileToUpload"] ["name"]), PATHINFO_EXTENSION)  

Улучшите этот ответ
отредактировал 8 июля ’19 в 23:26
Peter Mortensen
27.3k2121 золотых значков9393 серебряных знака123123 бронзовых значки
ответил 24 мая ’16 в 9:53
добавить комментарий |

Вы также можете попробовать это:

  pathinfo (basename ($ _ FILES ["  fileToUpload "] [" имя "]), PATHINFO_EXTENSION)  

3

Я обнаружил, что решения pathinfo () и SplFileInfo хорошо работают для стандартных файлов в локальной файловой системе, но вы могут возникнуть трудности, если вы работаете с удаленными файлами, так как URL-адреса для действительных изображений могут иметь # (идентификаторы фрагментов) и/или ? (параметры запроса ) в конце URL-адреса, который оба этих решения (неверно) будут рассматривать как часть расширения файла.

Я обнаружил, что это надежный способ использовать pathinfo () в URL-адресе после его первого анализа, чтобы убрать ненужный беспорядок после расширения файла:

  $ url_components = parse_url ($ url); //Сначала анализируем URL $ url_path = $ url_components ['path']; //Затем получаем компонент пути $ ext = pathinfo ($ url_path, PATHINFO_EXTENSION); //Затем используйте pathinfo ()  

Улучшить этот ответ
ответил 20 января 2015, 20:40
добавить комментарий |

Я обнаружил, что решения pathinfo () и SplFileInfo хорошо работает для стандартных файлов в локальной файловой системе, но вы можете столкнуться с трудностями, если работаете с удаленными файлами, поскольку URL-адреса для допустимых изображений могут иметь # (идентификаторы фрагментов) и/или ? (параметры запроса) в конце URL-адреса, который оба этих решения (неверно) будут рассматривать как часть расширения файла.

Я обнаружил, что это было надежный способ использования pathinfo () в URL-адресе после его первого анализа, чтобы убрать ненужный беспорядок после расширения файла:

  $  url_components = parse_url ($ url); //Сначала анализируем URL $ url_path = $ url_components ['path']; //Затем получаем компонент пути $ ext = pathinfo ($ url_path, PATHINFO_EXTENSION); //Затем используйте pathinfo ()  

3

Используйте substr ($ path, strrpos ($ path, '.') + 1); . Это самый быстрый метод сравнения.

@Kurt Zhong уже ответил.

Давайте проверим сравнительный результат здесь: https://eval.in/661574

Улучшите этот ответ
отредактировал июль 8 ’19, в 23:26
Peter Mortensen
27.3k2121 золотых знака9393 серебряных знака123123 бронзовых знака
ответил 17 окт.’16 в 17:09
  • Нет. Это не самый быстрый и вас немного удивит, если вы вызовете его с именем файла без расширения. — dkellner 06 авг.2020, в 23:42
добавить комментарий |

Используйте substr ($ path, strrpos ($ path, '.') + 1); . Это самый быстрый метод сравнения.

@Kurt Zhong уже ответил.

Давайте проверим сравнительный результат здесь: https://eval.in/661574


3
  ltrim (strstr ($ file_url, '.'), '.')  

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

Улучшить этот ответ
отредактировано 31 октября ’19 в 12:03
Салман Зафар
2, 4144 золотых знака1414 серебряных знаков3333 бронзовых знака
16 июля ’19 в 22:24
добавить комментарий |

  ltrim (strstr ($ file_url, '.'), '.')  

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


2

Это сработает

  $  ext = pathinfo ($ filename, PATHINFO_EXTENSION);  

Улучшите этот ответ
ответил 15 января ’15 в 10:12
  • Субодх уже дал гораздо более точный ответ на этот вопрос еще в августе. — Ниссе Энгстрём Ян 15 ’15 в 12:18
  • 2
    Это уже предлагалось еще в 2008 году. Отправляйте ответ только в том случае, если у вас есть что-то уникальное и ценное. Избыточный контент только тратит время исследователей и раздувает страницы Stack Overflow. — mickmackusa 28 июн. ’20 в 4:03
добавить комментарий |

Это будет работать

  $ ext = pathinfo ($ filename, PATHINFO_EXTENSION);   

2

Вы можете получить все расширения файлов в определенной папке и выполнять операции с определенным расширением файла:

   php $ files = glob ("abc/*. * ");//abc - это папка все файлы внутри папки//print_r ($ files);//echo count ($ files); for ($ i = 0; $ i   

Улучшите этот ответ
отредактировал 8 июля ’19 в 23:29
Peter Mortensen
27.3k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 4 мая ’16 в 17:35
добавить комментарий |

Вы можете получить все файлы e xtensions в определенной папке и выполнять операции с определенным расширением файла:

   php $ files = glob ("abc/*.*"); //abc - это папка все файлы внутри папки//print_r ($ files); //счетчик эхо ($ files);  for ($ i = 0; $ i   

2

$ ext = preg_replace ('/^.*.([^.pting+)$/D', '$ 1', $ fileName);

preg_replace подход, мы используем поиск и замену регулярных выражений. В функции preg_replace первый параметр — это шаблон для поиска, второй параметр $ 1 — это ссылка на то, что соответствует первому (. *), А третий параметр — имя файла.

Другой способ, мы также можем используйте strrpos, чтобы найти позицию последнего вхождения ‘.’ в имени файла и увеличить эту позицию на 1, чтобы она взорвала строку из (.)

$ ext = substr ($ fileName, strrpos ($ fileName, '.') + 1);

Улучшите этот ответ
ответил 14 сен ’19 в 16:50
добавить комментарий |

$ ext = preg_replace ('/^.*.([^.pting+)$/D' , '$ 1', $ fileName);

preg_replace подход, мы используем поиск и замену регулярных выражений. В функции preg_replace первый параметр — это шаблон для поиска, второй параметр $ 1 — это ссылка на то, что соответствует первому (. *), А третий параметр — имя файла..

Другой способ, мы также можем использовать strrpos, чтобы найти позицию последнего вхождения символа ‘.’ в имени файла и увеличить эту позицию на 1, чтобы она взорвала строку из (.)

$ ext = substr ($ fileName, strrpos ($ fileName, '.') + 1);


1

Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не Не хочу все токенизировать. Многие другие ответы потерпят неудачу с /root/my.folder/my.css

  ltrim (strrchr ($ PATH, '.')  , '.');  

Улучшите этот ответ
9 сен 2016, 13:54
добавить комментарий |

Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не захотите токенизировать все. Многие другие ответы потерпят неудачу с /root/my.folder/my.css

  ltrim (strrchr ($ PATH, '.')  , '.');  

1

Хотя «лучший способ» спорен, я считаю, что это лучший способ по нескольким причинам:

  function getExt ($ path) {$ basename = basename (  $ path);  return substr ($ basename, strlen (explode ('.', $ basename) [0]) + 1);}  
  1. Он работает с несколькими частями, чтобы расширение, например, tar.gz
  2. Короткий и эффективный код
  3. Он работает как с именем файла, так и с полным путем
Улучшить этот ответ

ответил 05 авг. в 18: 33
добавить комментарий |

Хотя «лучший способ» спорен, я считаю, что это лучший способ по нескольким причинам:

  функция getExt ($ path) {$ basename = basename ($ path);  return substr ($ basename, strlen (explode ('.', $ basename) [0]) + 1);}  
  1. Он работает с несколькими частями, чтобы расширение, например, tar.gz
  2. Короткий и эффективный код
  3. Он работает как с именем файла, так и с полным путем

1

ИМО, это лучший способ, если у вас есть имена файлов, такие как name.name.name. ext (некрасиво, но иногда бывает):

  $ ext = explode ('.', $ filename); //Расчленить строку $ my_ext = end ($ ext); //Получаем последнюю запись массива echo $ my_ext;  

Улучшите этот ответ
отредактировано 16 декабря ’20 в 9:21
ответил 5 апр ’19 в 16:19
добавить комментарий |

IMO, это лучший способ, если у вас есть имена файлов, такие как name.name.name.ext (некрасиво, но иногда случается):

  $ ext = explode ('.', $ filename); //Расчленить строку $ my_ext = end ($ ext); //Получение последней записи массива echo $ my_ext;  

0

На самом деле, я это искал.

   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);  

Улучшите этот ответ
ответил 28 марта ‘ 19, 14:18
добавить комментарий |

Собственно, я это и искал.

   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);  

0

Я попробовал одно простое решение, которое может помочь кому-то другому получить только имя файла из URL-адреса, имеющего параметры получения

   php $ path = "URL-адрес будет здесь  "; echo basename (parse_url ($ path) ['path']);?>  

Спасибо

Улучшите этот ответ
ответил 7 января в 13:14
добавить комментарий |

Я попробовал одно простое решение, которое может помочь кому-то другому получить только имя файла из URL, имеющего параметры получения

   php $ path = "URL будет здесь"; echo basename (parse_url ($ path) ['path']) ;?  >  

Спасибо


-1

Используйте

  str_replace ('.', '', strrchr ($ file_name, '.'))  

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

Улучшите этот ответ
ответил 28 нояб., 12:05
добавить комментарий |

Используйте

  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]   

0

Я создал пример конфигурации, которая может выполнять/testclass/testmethod без. php extension

Для правил перезаписи я следовал рекомендациям codeigniter

Улучшите этот ответ
ответил 11 сен ’14 в 16:51
добавить комментарий |

Я создал пример конфигурации, которая может выполнять/testclass/testmethod без расширения .php

Что касается правил перезаписи, я следовал рекомендациям codeigniter

Оцените статью
logicle.ru
Добавить комментарий