web-dev-qa-db-fra.com

Contient insensible à la casse

J'ai le suivant:

if (referrer.indexOf("Ral") == -1) { ... }

Ce que j’aime faire, c’est de rendre Ral insensible à la casse, de sorte qu’il puisse être RAl, rAl, etc. et rester identique.

Existe-t-il un moyen de dire que Ral doit être insensible à la casse? 

328
Nate Pet

Ajoutez .toLowerCase() après referrer. Cette méthode transforme la chaîne en chaîne minuscule. Ensuite, utilisez .indexOf() en utilisant ral au lieu de Ral.

if (referrer.toLowerCase().indexOf("ral") === -1) { 

La même chose peut également être obtenue en utilisant une expression régulière (particulièrement utile lorsque vous souhaitez tester des modèles dynamiques):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp
495
Rob W

Une autre option consiste à utiliser la méthode de recherche comme suit:

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

Il semble plus élégant que de convertir toute la chaîne en minuscules et peut être plus efficace. 
Avec toLowerCase(), le code a deux passages sur la chaîne, un passage sur la chaîne entière pour le convertir en minuscule et un autre pour rechercher l'index souhaité.
Avec RegExp, le code passe en un passage sur la chaîne dont il cherche à correspondre à l'index souhaité.

Par conséquent, sur les chaînes longues, je recommande d'utiliser la version RegExp (je suppose que sur les chaînes courtes, cette efficacité dépend toutefois du fait de créer l'objet RegExp)

81
Kfir Erez

Utilisez un RegExp:

if (!/ral/i.test(referrer)) {
    ...
}

Ou utilisez .toLowerCase():

if (referrer.toLowerCase().indexOf("ral") == -1)
19
gilly3

Il y a plusieurs approches ici.

Si vous souhaitez effectuer une vérification sensible à la casse pour cette instance uniquement, procédez comme suit.

if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
    ...

Sinon, si vous effectuez cette vérification régulièrement, vous pouvez ajouter une nouvelle méthode semblable à indexOf()- à String, mais la rendre sensible à la casse.

String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
10
cheeken

Depuis ES2016, vous pouvez également utiliser une méthode légèrement meilleure/plus simple/plus élégante:

if (referrer.includes("Ral")) { ... }

ou

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

Voici une comparaison des fonctions .indexOf() et .includes(): https://dev.to/adroitcoder/includes-vs-indexof-in-javascript

5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
4
Kendall Frey

Nous sommes en 2016 et il n'y a pas de moyen clair de procéder. J'espérais un peu de copypasta. Je vais essayer.

Notes de conception: je souhaitais minimiser l'utilisation de la mémoire et donc améliorer la vitesse - afin d'éviter toute copie/mutation des chaînes. Je suppose que le V8 (et d’autres moteurs) peut optimiser cette fonction.

//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
    //TODO: guard conditions here

    var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
    var needleIndex = 0;
    var foundAt = 0;
    for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
        var needleCode = needle.charCodeAt(needleIndex);
        if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
        var haystackCode = haystack.charCodeAt(haystackIndex);
        if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser

        //TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
        //if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
        if (haystackCode !== needleCode)
        {
            foundAt = haystackIndex;
            needleIndex = 0; //Start again
        }
        else
            needleIndex++;

        if (needleIndex == needle.length)
            return foundAt;
    }

    return -1;
}

Ma raison pour le nom:

  • Devrait avoir IndexOf dans le nom
  • Ne pas ajouter de suffixe - Of fait référence au paramètre suivant
  • N'utilisez pas de "casse sensible" qui est tellement long
  • "naturel" est un bon candidat, car les comparaisons par défaut sensibles à la casse ne sont pas naturelles pour l'homme en premier lieu. 

Pourquoi pas...:

  • toLowerCase() - appels potentiels répétés à toLowerCase sur la même chaîne.
  • RegExp - difficile à chercher avec variable. Même l'objet RegExp est gênant d'avoir à échapper des caractères
1
Todd

Pour faire une meilleure recherche, utilisez le code suivant,

var myFav   = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";

// Check for matches with the plain Vanilla indexOf() method:
alert( theList.indexOf( myFav ) );

// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );

Dans la première alerte (), JavaScript a renvoyé "-1", autrement dit indexOf () n'a pas trouvé de correspondance: c'est simplement parce que "JavaScript" est en minuscule dans la première chaîne et correctement mis en majuscule dans la seconde. Pour effectuer des recherches insensibles à la casse avec indexOf (), vous pouvez placer les deux chaînes en majuscule ou en minuscule. Cela signifie que, comme dans la deuxième alerte (), JavaScript ne vérifiera que l'occurrence de la chaîne que vous recherchez, la mise en majuscule étant ignorée.

Référence, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm

1
Diganta Kumar

Voici ma prise:

Script:

var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
  $("#textContainer").html(originalText)
  var text = $("#textContainer").html()
  var val = $("#search").val()
  if(val=="") return;
  var matches = text.split(val)
  for(var i=0;i<matches.length-1;i++) {
    var ind =  matches[i].indexOf(val)
    var len = val.length
      matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
  }
  $("#textContainer").html(matches.join(""))

HTML: 

<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>

Codepen

0

Si referrer est un tableau, vous pouvez utiliser findIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
0
A-Sharabiani

Exemple pour n'importe quelle langue:

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
0
alex_1948511