Имя файла Php без расширения

Обновлено: 04.07.2024

Узнайте, как получить имя и расширение файла из строки PHP, содержащей местоположение файла

  • Даниял Хамид
  • 25 августа 2020 г.
  • 4 темы
  • 7 минут чтения

Использование базового имени()

Мы можем использовать basename() для возврата имени файла и расширения из пути к файлу, поскольку функция возвращает конечный компонент из строки, содержащей путь к файлу или каталогу. Чтобы продемонстрировать, как это работает, рассмотрим несколько примеров:

Заставить basename() работать с многобайтовыми символами:

Поскольку basename() поддерживает локаль, она не будет корректно работать с многобайтовыми символами, пока сначала не будет задана соответствующая локаль с помощью функции setlocale().

Использование pathinfo()

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

Мы могли бы также использовать константы PATHINFO_FILENAME и PATHINFO_EXTENSION с pathinfo(), чтобы получить имя файла и расширение отдельно.

Или то же самое можно написать без передачи опции в качестве второго аргумента функции pathinfo() , и в этом случае она вернет ассоциативный массив, содержащий информацию о пути к файлу. Например:

Мы могли бы также использовать $pathInfo['filename'] и $pathInfo['extension'] с pathinfo(), чтобы получить имя файла и расширение по отдельности.

Давайте рассмотрим еще несколько примеров:

В приведенном выше примере обратите внимание, как возвращается basename . но ни имя файла, ни расширение не совпадают.

Заставить pathinfo() работать с многобайтовыми символами:

Поскольку pathinfo() поддерживает локаль, она не будет корректно работать с многобайтовыми символами, пока сначала не будет задана соответствующая локаль с помощью функции setlocale().

Использование взрыва() с DIRECTORY_SEPARATOR

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

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

Работа с многобайтовыми символами:

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

Использование класса SplFileInfo

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

  1. SplFileInfo::getBasename()
  2. SplFileInfo::getFilename()

При использовании любого из них будьте осторожны с различиями между ними, как показано в некоторых из следующих примеров:

Обратите внимание, что в следующих случаях в методе getFilename() есть косая черта, а в методе getBasename() ее нет:

Заставить методы SplFileInfo работать с многобайтовыми символами:

Согласно документам, SplFileInfo::getBasename() учитывает локаль, а SplFileInfo::getFilename() — нет. Это означает, что для правильной работы SplFileInfo::getBasename() с многобайтовыми символами необходимо сначала установить соответствующий языковой стандарт с помощью функции setlocale().

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

Надеюсь, этот пост был вам полезен. Опубликовано 25 августа 2020 г. Пожалуйста, проявите свою любовь и поддержку, поделившись этим постом.

Если у меня есть файл с именем my.zip , эта функция возвращает .zip .

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

Файл — это просто строка в переменной.


17 ответов 17

В этом нет необходимости. Проверьте pathinfo(), он дает вам все компоненты вашего пути.

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

Вывод кода:

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


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

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

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

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

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

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

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


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

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

Тот, кто решил, что имя файла не имеет расширения, а базовое имя имеет, должен иметь какие-то садистские наклонности.

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

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

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

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

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


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

Нет необходимости писать много кода. Даже это можно сделать всего одной строкой кода. Смотрите здесь

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

Это уже упоминалось в принятом ответе. Этот ответ не добавляет ничего нового на страницу на момент публикации.

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

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

Пояснение

$_SERVER['SCRIPT_NAME'] содержит путь к текущему скрипту.

Если у вас есть имя файла, из которого нужно удалить расширение с помощью PHP, это можно сделать несколькими способами. Вот три способа с небольшим сравнением.

Использование информации о пути

Функция pathinfo() возвращает массив, содержащий имя каталога, базовое имя, расширение и имя файла. Кроме того, вы можете передать ему одну из констант PATHINFO_ и просто вернуть эту часть полного имени файла:

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

Использование базового имени

Если расширение известно и одинаково для всех имен файлов, вы можете передать второй необязательный параметр в функцию basename(), чтобы удалить это расширение из имени файла:

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

Использование substr и strrpos

Если имя файла содержит полный путь, возвращается полный путь и имя файла без расширения. Вы также можете использовать basename(), чтобы избавиться от пути, если это необходимо (например, basename(substr($filename, 0, strrpos($filename, ".")))) хотя это медленнее, чем использование pathinfo.

Сравнение

Выполнение каждого из них в цикле 10 000 000 раз на моем Mac с PHP 5.4:

pathinfo: 10,13 секунды
basename: 7,87 секунды
substr/strrpos: 6,05 секунды
basename(substr/strrpos): 11,98 секунды

Если имя файла не содержит полного пути или не имеет значения, если он есть, то вариант substr/strrpos будет самым быстрым.

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

Если имя файла содержит путь, путь вам не нужен и вы не знаете, какое у него расширение, используйте параметр pathinfo().

Заключение

Есть много других способов сделать это, и некоторые из них могут быть быстрее. Во многих случаях скорость, вероятно, не имеет большого значения (в конце концов, 10 секунд для запуска pathinfo были 10 миллионов раз); целью этого поста было показать несколько способов удаления расширения из имени файла с помощью PHP.

Если вы ищете, как получить имя файла без расширения, то нет необходимости делать какое-либо кодирование или какую-либо логику для получения имени файла без расширения, просто вы можете использовать встроенную функцию php «pathinfo». Эта функция вернет массив с файлом такая информация, как расширение, имя файла без расширения, базовое имя и т. д. Для получения дополнительной информации см. приведенный ниже пример.

будет выведено как

Поделиться:

Оставить ответ Отменить ответ

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

ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР НОВОСТИ

Lorem Ipsum είναι απλά ένα κείμενο χωρίς νόημα για τους επαγγελματίες της τυπογραφίας κειοι στιοιχειοι στιοιχ

WordPress — это веб-приложение, которое можно использовать для создания красивого веб-сайта или блога. Мы любим говорить, что WordPress бесплатен и бесценен одновременно.

Magento – это программное обеспечение и платформа для электронной коммерции, которым доверяют ведущие мировые бренды. Развивайте свой онлайн-бизнес с Magento.

WordPress – это бесплатный инструмент для ведения блогов с открытым исходным кодом и система управления контентом (CMS) на основе PHP и MySQL.

Лучшие публикации и страницы

  • Предварительный просмотр вертикальной прокрутки новостей WordPress в реальном времени
  • Плагин Live Preview WordPress с адаптивным фильтруемым портфолио
  • как получить ключи флажка Google ReCaptcha v2
  • Подключаемый модуль полноэкранного слайдера для предварительного просмотра в реальном времени
  • Адаптивные горизонтальные, вертикальные, прокручиваемые и аккордеонные вкладки WordPress
  • Слайдер товаров для WOOCOMMERCE
  • Непрерывный слайдер WordPress для предварительного просмотра с помощью Lightbox Pro
  • IIF в php
  • как получить ключи Google ReCaptcha v3
  • Отзывчивый слайдер эскизов в реальном времени

Веб-решение I13

Подпишитесь на нашу рассылку

Хотите получать уведомления, когда наша статья будет опубликована? Введите свой адрес электронной почты и имя ниже, чтобы узнать об этом первыми.

Категории

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

Что мы собираем

  • имя
  • контактная информация, включая адрес электронной почты
  • демографическая информация, такая как почтовый индекс, предпочтения и интересы
  • другая информация, относящаяся к опросам клиентов и/или предложениям

Что мы делаем с собранной информацией

Эта информация необходима нам для понимания ваших потребностей и предоставления вам более качественных услуг, в частности, по следующим причинам:

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

Безопасность

Мы стремимся обеспечить безопасность вашей информации. Чтобы предотвратить несанкционированный доступ или раскрытие информации, мы внедрили подходящие физические, электронные и управленческие процедуры для защиты и защиты информации, которую мы собираем в Интернете.

Ссылки на другие сайты

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

Контроль вашей личной информации

Вы можете ограничить сбор или использование вашей личной информации следующими способами:

Мы не будем продавать, распространять или сдавать в аренду вашу личную информацию третьим лицам, если у нас нет вашего разрешения или если это требуется по закону. Мы можем использовать вашу личную информацию для отправки вам рекламной информации о третьих лицах, которая, по нашему мнению, может вас заинтересовать, если вы сообщите нам, что хотите, чтобы это произошло. Вы можете запросить подробности личной информации, которую мы храним о вас в соответствии с Законом о защите данных 1998 года. Будет уплачена небольшая плата. Если вы хотите получить копию имеющейся у вас информации, напишите в I Thirteen Web Solution, Surat India.Если вы считаете, что какая-либо информация, которую мы храним о вас, неверна или неполна, пожалуйста, напишите или напишите нам как можно скорее по указанному выше адресу. Мы незамедлительно исправим любую информацию, которая окажется неверной.

Читайте также: