Comment savoir qu'une chaîne commence / se termine par une chaîne spécifique dans jQuery?

206

Je veux savoir si une chaîne commence par le caractère / chaîne spécifié ou se termine par elle dans jQuery.

Par exemple:

var str = 'Hello World';

if( str starts with 'Hello' ) {
   alert('true');
} else {
   alert('false');
}

if( str ends with 'World' ) {
   alert('true');
} else {
   alert('false');
}

S'il n'y a pas de fonction, alors une alternative?

Naveed
la source
Utiliser les nouvelles fonctionnalités d'ES6
Salvador Dali
2
Ouais, ou n'utilisez pas encore ES6 si vous avez des utilisateurs qui utilisent IE plus tôt que Edge.
Antares42

Réponses:

388

Une option consiste à utiliser des expressions régulières:

if (str.match("^Hello")) {
   // do this if begins with Hello
}

if (str.match("World$")) {
   // do this if ends in world
}
Lukáš Lalinský
la source
1
dans jQuery j'ai essayé str.startsWith ('une certaine chaîne de vérification ..') cela m'a donné une erreur en disant, la méthode startsWith n'a pas été trouvée .. :( mais str.match a fonctionné. Merci pour votre réponse
Débora
2
Attention, la chaîne que vous inspectez ne contient aucun caractère réservé aux expressions rationnelles.
nokturnal
23
Passer un objet regex au lieu d'une chaîne regex semble résoudre le problème @nokturnal mentionne: str.match(/^Hello/)Mais la forme /regex/.test(str)est encore meilleure pour ce cas particulier, par stackoverflow.com/questions/10940137/…
CrazyPyro
Cela retournerait une chaîne correspondante, mais pas une valeur booléenne.
RajKumar Samala
var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- pourquoi cela renvoie-t-il la valeur nulle lorsque l'option sélectionnée est "Non disponible - Autre"?
egmfrs
96

Pour commencer, vous pouvez utiliser indexOf:

if(str.indexOf('Hello') == 0) {

...

ref

et vous pouvez faire le calcul en fonction de la longueur de la chaîne pour déterminer «endswith».

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {
sje397
la source
11
vous voudrez peut-être utiliser lastIndexOf()pour la fin;)
Reigel
Attention, IndexOf n'est pas pris en charge dans le navigateur IE8. Même chose avec lastIndexOf.
Pedro Lopes
1
Je m'excuse pour la confusion. Je faisais référence à Array.prototype.indexOf () qui n'est pris en charge que pour iE9 + et non String.prototype.indexOf () qui est IE4 +
Pedro Lopes
3
Une réponse beaucoup plus sûre que l'utilisation d'expressions régulières pour un cas d'utilisation aussi simple. Devrait probablement être accepté la réponse.
AntonChanning
1
Le code pour «endswith» est défectueux. Lors de la recherche d'une chaîne qui n'apparaît pas dans la chaîne et qui a la longueur = (mot - 1). Par exemple. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)résultats en vrai.
Nick Russler
23

Il n'est pas nécessaire que jQuery le fasse. Vous pouvez coder un wrapper jQuery mais ce serait inutile, vous devriez donc mieux utiliser

var str = "Hello World";

window.alert("Starts with Hello ? " + /^Hello/i.test(str));        

window.alert("Ends with Hello ? " + /Hello$/i.test(str));

car la méthode match () est obsolète.

PS: le drapeau "i" dans RegExp est facultatif et signifie insensible à la casse (il retournera donc également vrai pour "bonjour", "hEllo", etc.).

Sebastien P.
la source
2
Pouvez-vous fournir un lien vers la documentation sur match () dépréciée? Une recherche rapide sur Google ne renvoie rien.
Cavyn VonDeylen
1
J'ai lu ça en ligne il y a quelques années, j'ai bien peur de ne plus pouvoir trouver où exactement.
Sebastien P.
16

Vous n'avez pas vraiment besoin de jQuery pour de telles tâches. Dans la spécification ES6, ils ont déjà des méthodes prêtes à l' emploi startWith et endsWith .

var str = "To be, or not to be, that is the question.";
alert(str.startsWith("To be"));         // true
alert(str.startsWith("not to be"));     // false
alert(str.startsWith("not to be", 10)); // true

var str = "To be, or not to be, that is the question.";
alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

Actuellement disponible en FF et Chrome . Pour les anciens navigateurs, vous pouvez utiliser leurs polyfills ou substr

Salvador Dali
la source
10

Vous pouvez toujours étendre le Stringprototype comme ceci:

//  Checks that string starts with the specific string
if (typeof String.prototype.startsWith != 'function') {
    String.prototype.startsWith = function (str) {
        return this.slice(0, str.length) == str;
    };
}

//  Checks that string ends with the specific string...
if (typeof String.prototype.endsWith != 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

Et utilisez-le comme ceci:

var str = 'Hello World';

if( str.startsWith('Hello') ) {
   // your string starts with 'Hello'
}

if( str.endsWith('World') ) {
   // your string ends with 'World'
}
Mr. Pumpkin
la source
2

ES6 prend désormais en charge la méthode startsWith()et endsWith()pour vérifier le début et la fin de strings. Si vous souhaitez prendre en charge les moteurs antérieurs à es6, vous pouvez envisager d'ajouter l'une des méthodes suggérées au Stringprototype.

if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str) {
    return this.match(new RegExp("^" + str));
  };
}

if (typeof String.prototype.endsWith != 'function') {
  String.prototype.endsWith = function (str) {
    return this.match(new RegExp(str + "$"));
  };
}

var str = "foobar is not barfoo";
console.log(str.startsWith("foob"); // true
console.log(str.endsWith("rfoo");   // true
16kb
la source
Toute chaîne qui contient des caractères qui doivent être échappés pour l'utilisation dans une expression régulière (par exemple ()[].) rompra vos méthodes de polyfill. Vous devez préparer les chaînes avec une fonction regex-escape. Ou encore mieux: utilisez un polyfill testé au combat à partir decore-js
nirazul