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?



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
}

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) {

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.).


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


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'
}

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.