Смотрите код:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
javascript
file-extension
Серхио дель Амо
источник
источник
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Это также заботится о.file
(Unix скрытых, я считаю) видах файлов. То есть, если вы хотите сохранить его как одну строчку, на мой вкус, это немного грязно.Будь проще :)
Редактировать:
Это еще одно решение без регулярных выражений, которое я считаю более эффективным:
Есть некоторые угловые случаи, которые лучше обрабатываются ответом VisioN ниже, особенно файлы без расширения (и
.htaccess
т. Д. Включены ).Он очень производительный и обрабатывает угловые случаи, возможно, лучшим способом, возвращая
""
вместо полной строки, когда нет точки или нет строки перед точкой. Это очень хорошо продуманное решение, хотя и сложное для чтения. Вставьте его в свою библиотеку помощников и просто используйте его.Старый Править:
Более безопасная реализация, если вы собираетесь запускать файлы без расширения или скрытые файлы без расширения (см. Комментарий VisioN к ответу Тома выше), будет что-то вроде этого
Если
a.length
это один, это видимый файл без расширения, т.е. файлЕсли
a[0] === ""
иa.length === 2
это скрытый файл без расширения т.е. .htaccessНадеюсь, что это поможет прояснить проблемы с немного более сложными случаями. С точки зрения производительности, я считаю, что это решение немного медленнее, чем регулярные выражения в большинстве браузеров. Тем не менее, для наиболее распространенных целей этот код должен быть полностью применим.
источник
filename
самом деле не имеет расширения? Разве это не просто возвращает базовое имя файла, что было бы довольно плохо?Следующее решение является быстрым и достаточно коротким для использования в массовых операциях и экономии дополнительных байтов:
Вот еще одно однострочное универсальное решение без регулярных выражений:
Оба корректно работают с именами, не имеющими расширения (например, myfile ) или начинающимися с
.
точки (например, .htaccess ):Если вам небезразлична скорость, вы можете запустить тест и убедиться, что предоставленные решения являются самыми быстрыми, а короткое - чрезвычайно быстрым:
Как работает короткая
String.lastIndexOf
Метод возвращает последнюю позицию подстроки (т.е."."
) в данной строке (т.е.fname
). Если подстрока не найдена, метод возвращает-1
.-1
и0
, которые соответственно относятся к именам без расширения (например"name"
) и к именам, начинающимся с точки (например".htaccess"
).>>>
с нулевой заливкой ( ), если используется с нулем, влияет на преобразование отрицательных чисел-1
в4294967295
и-2
в4294967294
, что полезно для сохранения неизменного имени файла в крайних случаях (в некотором роде хитрость здесь).String.prototype.slice
извлекает часть имени файла из позиции, которая была рассчитана, как описано. Если номер позиции больше длины строкового метода, возвращается""
.Если вы хотите более четкое решение, которое будет работать точно так же (плюс с дополнительной поддержкой полного пути), проверьте следующую расширенную версию. Это решение будет медленнее, чем предыдущие однострочные, но гораздо проще для понимания.
Все три варианта должны работать в любом веб-браузере на стороне клиента и могут также использоваться в коде NodeJS на стороне сервера.
источник
Протестировано с
Также
источник
источник
источник
источник
источник
Код
Тестовое задание
Обратите внимание, что при отсутствии запроса фрагмент может все еще присутствовать.
JSLint
0 Предупреждения.
источник
Быстро и правильно работает с путями
Некоторые крайние случаи
Решения, использующие разделение, являются медленными, а решения с lastIndexOf не обрабатывают крайние случаи.
источник
.exec()
. Ваш код будет лучше как(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.Я просто хотел поделиться этим.
хотя это имеет недостаток, что файлы без расширения будут возвращать последнюю строку. но если вы сделаете это, это исправит все:
источник
slice
метод относится к массивам, а не к строкам. Для строкsubstr
илиsubstring
будет работать.String.prototype.slice
и то, иArray.prototype.slice
другое, что-то вроде метода работыЯ уверен, что кто-то может и будет минимизировать и / или оптимизировать мой код в будущем. Но на данный момент я на 200% уверен, что мой код работает в каждой уникальной ситуации (например, только с именем файла , с относительными , корневыми и абсолютными URL, с фрагментными
#
тегами, с запросом?
строками и т. Д.). иначе вы можете решить бросить это), безупречно и с высокой точностью.Для доказательства посетите: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Вот JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
Не для того, чтобы быть самоуверенным или дуть в мою собственную трубу, но я не видел ни одного блока кода для этой задачи (поиск «правильного» расширения файла, среди множества различных
function
входных аргументов), который работает так же, как и это.Примечание. По замыслу, если расширение файла не существует для данной входной строки, оно просто возвращает пустую строку
""
, а не ошибку или сообщение об ошибке.Примечание (2): Если вам нравится мой код, обязательно добавьте его в свою библиотеку js и / или репозиторий, потому что я усердно работал над его совершенствованием, и было бы стыдно тратить его впустую. Итак, без лишних слов, вот оно:
Наслаждайтесь! Добро пожаловать !:
источник
источник
Если вы имеете дело с веб-URL, вы можете использовать:
Демо: https://jsfiddle.net/squadjot/q5ard4fj/
источник
Попробуй это:
источник
редактировать: странно (или, возможно, это не так),
$1
во втором аргументе метода замены, кажется, не работает ... Извините.источник
Я только что понял, что недостаточно комментировать ответ p4bl0, хотя ответ Тома ясно решает проблему:
источник
Для большинства приложений используется простой скрипт, такой как
будет работать просто отлично (как предоставлено Томом). Однако это не дурак. Не работает, если указано следующее имя файла:
Это может быть немного излишним, но я бы предложил использовать такой парсер URL, как этот на провал из - за избегайте непредсказуемых имен файлов.
Используя эту функцию, вы можете получить имя файла следующим образом:
Это выведет "image.jpg" без изменения URL. Тогда вы можете получить расширение файла.
источник
источник
//Применение
расширение ( 'file.jpeg')
всегда возвращает расширение ниже cas, так что вы можете проверить его при смене поля:
file.JpEg
файл (без расширения)
файл. (Noextension)
источник
Если вы ищете конкретное расширение и знаете его длину, вы можете использовать substr :
Справочник по JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
источник
Я много лун опаздываю на вечеринку, но для простоты я использую что-то вроде этого
источник
Для этого в
path
модуле есть стандартная библиотечная функция :Вывод:
Итак, если вы хотите только формат:
Если расширения нет, функция вернет пустую строку:
Если вы используете Node, то
path
встроенный. Если вы ориентируетесь на браузер, то Webpack поставитpath
вам реализацию. Если вы нацеливаетесь на браузер без Webpack, то вы можете включить path-browserify вручную.Нет причин делать разбиение строк или регулярное выражение.
источник
"one-liner" для получения имени файла и расширения с использованием
reduce
и деструктуризацией массива :с лучшим отступом:
источник
Однострочное решение, которое также будет учитывать параметры запроса и любые символы в URL.
источник
page.html#fragment
), это вернет расширение файла и фрагмент.Это простое решение
тесты
источник
Ответ Уоллесера хорош, но нужна еще одна проверка.
Если файл не имеет расширения, он будет использовать имя файла как расширение, что не очень хорошо.
Попробуй это:
источник
Не забывайте, что некоторые файлы не могут иметь расширения, поэтому:
источник
источник
источник