Voir le code:
var file1 = "50.xsl";
var file2 = "30.doc";
getFileExtension(file1); //returns xsl
getFileExtension(file2); //returns doc
function getFileExtension(filename) {
/*TODO*/
}
javascript
file-extension
Sergio del Amo
la source
la source
return filename.substring(0,1) === '.' ? '' : filename.split('.').slice(1).pop() || '';
Cela prend également en charge le.file
type de fichiers (Unix caché, je crois) aussi. C'est si vous voulez le garder comme une doublure, ce qui est un peu désordonné à mon goût.Rester simple :)
Éditer:
Ceci est une autre solution non regex qui, je pense, est plus efficace:
Il y a quelques cas de coin qui sont mieux traités par la réponse de VisioN ci-dessous, en particulier les fichiers sans extension (
.htaccess
etc. inclus).Il est très performant et gère les cas d'angle d'une manière sans doute meilleure en retournant
""
au lieu de la chaîne complète lorsqu'il n'y a pas de point ou pas de chaîne avant le point. C'est une solution très bien conçue, bien que difficile à lire. Collez-le dans votre bibliothèque d'aide et utilisez-le.Ancien montage:
Une implémentation plus sûre si vous allez exécuter des fichiers sans extension ou des fichiers cachés sans extension (voir le commentaire de VisioN à la réponse de Tom ci-dessus) serait quelque chose dans ce sens
Si
a.length
c'est un, c'est un fichier visible sans extension c'est-à-dire. fichierSi
a[0] === ""
eta.length === 2
c'est un fichier caché sans extension ie. .htaccessJ'espère que cela aide à résoudre les problèmes avec les cas légèrement plus complexes. En termes de performances, je pense que cette solution est un peu plus lente que regex dans la plupart des navigateurs. Cependant, pour la plupart des utilisations courantes, ce code devrait être parfaitement utilisable.
la source
filename
aucune extension n'est disponible? Cela ne retournerait-il pas simplement le nom de fichier de base, ce qui serait un peu mauvais?La solution suivante est rapide et suffisamment courte pour être utilisée dans des opérations en bloc et économiser des octets supplémentaires:
Voici une autre solution universelle non regexp d'une ligne:
Les deux fonctionnent correctement avec des noms sans extension (par exemple monfichier ) ou commençant par un
.
point (par exemple .htaccess ):Si vous vous souciez de la vitesse, vous pouvez exécuter la référence et vérifier que les solutions fournies sont les plus rapides, tandis que la courte est extrêmement rapide:
Comment fonctionne le court:
String.lastIndexOf
retourne la dernière position de la sous-chaîne (ie"."
) dans la chaîne donnée (iefname
). Si la sous-chaîne n'est pas trouvée, la méthode retourne-1
.-1
et0
, qui se réfèrent respectivement aux noms sans extension (par exemple"name"
) et aux noms commençant par un point (par exemple".htaccess"
).>>>
) s'il est utilisé avec zéro affecte les nombres négatifs se transformant-1
en4294967295
et-2
vers4294967294
, ce qui est utile pour garder le nom de fichier inchangé dans les cas de bord (une sorte d'astuce ici).String.prototype.slice
extrait la partie du nom de fichier de la position qui a été calculée comme décrit. Si le numéro de position est supérieur à la longueur de la méthode de chaîne renvoyée""
.Si vous voulez une solution plus claire qui fonctionnera de la même manière (plus avec un support supplémentaire du chemin complet), vérifiez la version étendue suivante. Cette solution sera plus lente que les monolignes précédentes mais est beaucoup plus facile à comprendre.
Les trois variantes doivent fonctionner dans n'importe quel navigateur Web côté client et peuvent également être utilisées dans le code NodeJS côté serveur.
la source
Testé avec
Aussi
la source
la source
la source
la source
la source
Code
Tester
Notez qu'en l'absence d'une requête, le fragment peut toujours être présent.
JSLint
0 Avertissements.
la source
Rapide et fonctionne correctement avec les chemins
Quelques cas de bord
Les solutions utilisant la division sont lentes et les solutions avec lastIndexOf ne gèrent pas les cas marginaux.
la source
.exec()
. Votre code sera meilleur au fur et à mesure(filename.match(/[^\\/]\.([^\\/.]+)$/) || [null]).pop()
.je voulais juste partager cela.
bien que cela ait pour inconvénient que les fichiers sans extension renverront la dernière chaîne. mais si vous le faites, cela résoudra tout:
la source
slice
méthode fait référence aux tableaux plutôt qu'aux chaînes. Pour les chaînessubstr
ousubstring
fonctionnera.String.prototype.slice
et aussi uneArray.prototype.slice
sorte de méthode pour les deux méthodes de travailJe suis sûr que quelqu'un pourra et va minimiser et / ou optimiser mon code à l'avenir. Mais, en ce moment , je suis à 200% confiant que mon code fonctionne dans toutes les situations uniques (par exemple, uniquement avec le nom de fichier uniquement , avec des URL relatives , relatives à la racine et absolues , avec des
#
balises de fragment , avec des?
chaînes de requête , etc.) sinon vous pouvez décider de vous lancer dessus), parfaitement et avec une précision extrême.Pour la preuve, visitez: https://projects.jamesandersonjr.com/web/js_projects/get_file_extension_test.php
Voici le JSFiddle: https://jsfiddle.net/JamesAndersonJr/ffcdd5z3/
Ne pas être trop confiant ou souffler ma propre trompette, mais je n'ai vu aucun bloc de code pour cette tâche (trouver l' extension de fichier `` correcte '' , au milieu d'une batterie d'
function
arguments d'entrée différents ) qui fonctionne aussi bien que cela.Remarque: Par conception, si une extension de fichier n'existe pas pour la chaîne d'entrée donnée, elle renvoie simplement une chaîne vide
""
, pas une erreur ni un message d'erreur.Remarque (2): Si vous aimez mon code, assurez-vous de l'ajouter à votre bibliothèque js et / ou repo, car j'ai travaillé dur pour le perfectionner, et ce serait dommage de le gaspiller. Donc, sans plus tarder, voici:
Prendre plaisir! De rien!:
la source
la source
Si vous avez affaire à des URL Web, vous pouvez utiliser:
Démo: https://jsfiddle.net/squadjot/q5ard4fj/
la source
Essaye ça:
la source
edit: Étrangement (ou peut-être pas) le
$1
dans le deuxième argument de la méthode replace ne semble pas fonctionner ... Désolé.la source
Je viens de réaliser qu'il ne suffit pas de mettre un commentaire sur la réponse de p4bl0, bien que la réponse de Tom résout clairement le problème:
la source
Pour la plupart des applications, un script simple tel que
fonctionnerait très bien (comme fourni par Tom). Cependant, ce n'est pas infaillible. Cela ne fonctionne pas si le nom de fichier suivant est fourni:
Il peut être un peu exagéré, mais je suggérerais d'utiliser un analyseur d'URL tel que celui-ci pour éviter l'échec en raison de noms de fichiers imprévisibles.
En utilisant cette fonction particulière, vous pouvez obtenir le nom de fichier comme ceci:
Cela produira "image.jpg" sans les variables URL. Ensuite, vous êtes libre de saisir l'extension du fichier.
la source
la source
//usage
extension ('file.jpeg')
renvoie toujours la casse d'extension inférieure afin que vous puissiez la vérifier sur les travaux de changement de champ pour:
file.JpEg
fichier (sans extension)
fichier. (sans extension)
la source
Si vous recherchez une extension spécifique et connaissez sa longueur, vous pouvez utiliser substr :
Référence JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
la source
Je suis beaucoup de lunes en retard à la fête mais pour plus de simplicité j'utilise quelque chose comme ça
la source
Il existe une fonction de bibliothèque standard pour cela dans le
path
module:Production:
Donc, si vous ne voulez que le format:
S'il n'y a pas d'extension, la fonction renverra une chaîne vide:
Si vous utilisez Node, alors
path
est intégré. Si vous ciblez le navigateur, Webpack fournira unepath
implémentation pour vous. Si vous ciblez le navigateur sans Webpack, vous pouvez inclure manuellement path-browserify .Il n'y a aucune raison de diviser des chaînes ou de regex.
la source
"one-liner" pour obtenir le nom de fichier et l'extension en utilisant
reduce
et la déstructuration des tableaux :avec une meilleure indentation:
la source
Une solution d'une seule ligne qui tiendra également compte des paramètres de requête et des caractères dans l'URL.
la source
page.html#fragment
), cela renverra l'extension de fichier et le fragment.Cette solution simple
Les tests
la source
La réponse de Wallacer est agréable, mais une vérification supplémentaire est nécessaire.
Si le fichier n'a pas d'extension, il utilisera le nom de fichier comme extension qui n'est pas bonne.
Essaye celui-là:
la source
N'oubliez pas que certains fichiers ne peuvent pas avoir d'extension, donc:
la source
la source
la source