2009-11-19 4 views
231

Possible en double:
Javascript StartsWithVérifiez si la chaîne commence par quelque chose?

Je sais que je peux faire comme^= pour voir si un identifiant commence par quelque chose, et j'essayé d'utiliser que pour cela, mais il n » ai pas travail t ... en fait, je récupérer l'URL et je veux définir une classe pour un élément pour qui commencent dans les chemins d'une certaine façon ...

Ainsi,

var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087 

Je veux vous assurer que pour chaque chemin qui commence par/sous/1, je peux définir une classe pour un élément ...

if(pathname ^= '/sub/1') { //this didn't work... 
     ... 
+0

'/^\/sub \/1. * $/Gi.test (chemin) retourne un booléen comme prédicat. –

+1

Si vous venez ici 6 ans plus tard (comme moi-même) le [original et dupliqué après Javascript StartsWith] (http://stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith- une autre chaîne) fournit une réponse très soignée, en utilisant la fonction startMith() d'Ecmascript 6, qui semble avoir les meilleures performances. – theFreedomBanana

Répondre

341

Utilisez stringObject.substring

if (pathname.substring(0, 6) == "/sub/1") { 
    // ... 
} 
+15

-1: crée une chaîne supplémentaire redondante. – user1071136

+9

Voici un exemple de test: http://jsperf.com/starts-with/2. La méthode de sous-chaîne semble être la plus rapide sur ma machine (avec V8). – Pijusn

+19

Ceci peut être rendu plus générique comme ceci: 'var x ="/sub/1 "; si (pathname.substring (0, x.length) === x) { // ... }; De cette façon, vous ne dépendez plus de la longueur de 'x' car cela peut changer. –

79

Vous pouvez utiliser string.match() et une expression régulière pour cela aussi:

if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes 

string.match() retourne un tableau de sous-chaînes correspondant si trouvé, sinon nulle .

+22

+1 pour ne pas avoir à spécifier la longueur de la chaîne de recherche – Mercurybullet

+0

insérer dynamiquement une chaîne d'URL dans l'expression? par exemple. échapper le/dans l'URL? – Tjorriemorrie

+1

@Tjorriemorrie Vous pouvez utiliser la classe RegEx pour ce faire, comme var reUrlTester = new RegEx (your_url_string); if (reUrlTester.test (url)) {// utilise la fonction test pour voir si l'URL correspond. – Cros

34

Un peu plus fonction réutilisable:

beginsWith = function(needle, haystack){ 
    return (haystack.substr(0, needle.length) == needle); 
} 
170
String.prototype.startsWith = function(needle) 
{ 
    return this.indexOf(needle) === 0; 
}; 
+9

-1 voir les commentaires ici pour une raison valable de ne pas utiliser ce type d'implémentation: http: // stackoverflow.com/a/1978419/560287 –

+12

+1 indexOf est parfait! Je suggère seulement de ne pas ajouter de méthodes aux objets que vous ne possédez pas. – collimarco

+1

C'est la réponse parfaite (indice de chose) que celle qui est marquée comme la réponse. –

22

Tout d'abord, permet d'étendre l'objet chaîne. Merci à Ricardo Peres pour le prototype, je pense que l'utilisation de la variable «chaîne» fonctionne mieux que «aiguille» dans le but de le rendre plus lisible.

String.prototype.beginsWith = function (string) { 
    return(this.indexOf(string) === 0); 
}; 

Ensuite, vous l'utilisez comme ceci. Mise en garde! Rend le code extrêmement lisible.

var pathname = window.location.pathname; 
if (pathname.beginsWith('/sub/1')) { 
    // Do stuff here 
} 
+4

N'ajoute vraiment rien. – ratbum

+0

IMHO ** indexOf ** recherche toute la chaîne si elle ne trouve pas de correspondance immédiate à son début: son inefficacité augmente donc pour des recherches très longues. –

Questions connexes