Recherche insensible à la casse

J'essaie d'obtenir une recherche insensible à la casse avec deux chaînes en JavaScript.

Normalement, ce serait comme ceci:

var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);

L'indicateur /i serait insensible à la casse.

Mais j'ai besoin de chercher une deuxième chaîne; sans le drapeau, cela fonctionne parfaitement:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);

Si j'ajoute l'indicateur /i à l'exemple ci-dessus, il recherchera searchstring et non ce qui est dans la variable " searchstring "(l'exemple suivant Ne fonctionne pas):

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);

Comment puis-je atteindre cette?

256
demandé sur Alexander Abakumov 2008-10-07 13:14:07

10 réponses

Ouais, utiliser .match plutôt que .search. Le résultat de l'appel .match retournera la chaîne réelle qui a été appariée elle-même, mais elle peut toujours être utilisée comme valeur booléenne.

var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';

if (result){
    alert('Matched');
}

L'utilisation d'une expression régulière comme celle-ci est probablement la façon la plus simple et la plus évidente de le faire en JavaScript, mais gardez à l'esprit que est une expression régulière, et peut donc contenir des métacaractères regex. Si vous voulez prendre la chaîne d'ailleurs (par exemple, entrée utilisateur), ou si vous voulez éviter d'avoir à échapper à beaucoup de métacaractères, alors vous êtes probablement mieux en utilisant indexOf comme ceci:

matchString = 'best';
// If the match string is coming from user input you could do
// matchString = userInput.toLowerCase() here.

if (string.toLowerCase().indexOf(matchString) != -1){
    alert('Matched');
}
351
répondu Dan 2008-10-07 09:48:42

Remplacer

var result= string.search(/searchstring/i);

Avec

var result= string.search(new RegExp(searchstring, "i"));
153
répondu Sergey Ilinsky 2014-09-06 05:36:27

Si vous recherchez simplement une chaîne plutôt qu'une expression régulière plus compliquée, vous pouvez utiliser indexOf() - mais n'oubliez pas de minuscules les deux chaînes d'abord parce que indexOf() est sensible à la casse:

var string="Stackoverflow is the BEST"; 
var searchstring="best";

// lowercase both strings
var lcString=string.toLowerCase();
var lcSearchString=searchstring.toLowerCase();

var result = lcString.indexOf(lcSearchString)>=0;
alert(result);

, Ou en une seule ligne:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
36
répondu Odilon Redo 2015-09-23 07:51:01

Supposons que nous voulions trouver la variable string needle dans la variable string haystack. Il y a trois pièges:

  1. les applications internationalisées devraient éviter string.toUpperCase et string.toLowerCase. Utilisez une expression régulière qui ignore la casse à la place. Par exemple, var needleRegExp = new RegExp(needle, "i"); suivi de needleRegExp.test(haystack).
  2. en général, vous ne connaissez peut-être pas la valeur de needle. Veillez à ce que needle ne contient aucune expression régulière caractères spéciaux. Échappez-les en utilisant needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. dans les autres cas, si vous voulez correspondre précisément needle et haystack, simplement ignorer le cas, assurez-vous d'ajouter "^" au début et à la "$" à la fin de votre expression régulière constructeur.

En prenant en considération les points (1) et (2), un exemple serait:

var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
alert(result);
17
répondu Chris Chute 2016-07-11 15:55:01

J'aime la réponse de @ CHR15TO, contrairement à d'autres réponses que j'ai vues sur d'autres questions similaires, cette réponse montre en fait comment échapper correctement une chaîne de recherche fournie par l'utilisateur (plutôt que de dire que ce serait nécessaire sans montrer comment).

Cependant, il est encore assez maladroit, et peut-être relativement plus lent. Alors pourquoi ne pas avoir une solution spécifique à ce qui est probablement une exigence commune pour les codeurs? (Et pourquoi ne pas l'inclure dans L'API ES6 BTW?)

Ma réponse [ https://stackoverflow.com/a/38290557/887092] sur une question similaire permet ce qui suit:

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);
2
répondu Todd 2017-05-23 12:18:20

ES6+:

let string="Stackoverflow is the BEST";
let searchstring="best";


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());

includes() retourne true si searchString apparaît à un ou plusieurs postes ou false autrement.

2
répondu Andrey 2018-10-09 16:35:04

Si vous êtes préoccupé par le cas "classe de caractères unterminated", supprimer tous les caractères non alphanumériques serait utile:

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
1
répondu dsomnus 2010-08-24 19:11:57

Il y a deux façons de comparer la casse:

  1. Convertissez les chaînes en majuscules, puis comparez-les en utilisant l'opérateur strict (===). Comment l'opérateur strict traite les opérandes lire des choses à: http://www.thesstech.com/javascript/relational-logical-operators

  2. Correspondance de modèle en utilisant des méthodes de chaîne:

    Utilisez la méthode de chaîne" search " pour la recherche insensible à la casse. En savoir plus sur la recherche et d'autres méthodes de chaîne à: http://www.thesstech.com/pattern-matching-using-string-methods

    <!doctype html>
      <html>
        <head>
          <script>
    
            // 1st way
    
            var a = "apple";
            var b = "APPLE";  
            if (a.toUpperCase() === b.toUpperCase()) {
              alert("equal");
            }
    
            //2nd way
    
            var a = " Null and void";
            document.write(a.search(/null/i)); 
    
          </script>
        </head>
    </html>
    
1
répondu Sohail Arif 2015-06-23 12:38:57

Je fais ceci souvent et utilise un prototype simple de 5 lignes qui accepte varargs. Il est rapidement et travaille partout.

myString.containsIgnoreCase('red','orange','yellow')

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ANY of the arguments is contained in the string
 */
String.prototype.containsIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
      return true
    }
  }
  return false
}

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ALL of the arguments are contained in the string
 */
String.prototype.containsAllIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
      return false
    }
  }
  return true
}

// Unit test

let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
FOO BAR
`

let data = [
  'foo',
  'Foo',
  'foobar',
  'barfoo',
  'first',
  'second'
]

let result
data.forEach(item => {
  console.log('Searching for', item)
  result = content.containsIgnoreCase(item)
  console.log(result ? 'Found' : 'Not Found')
})

console.log('Searching for', 'x, y, foo')
result = content.containsIgnoreCase('x', 'y', 'foo');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar, foobar')
result = content.containsAllIgnoreCase('foo', 'bar', 'foobar');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar')
result = content.containsAllIgnoreCase('foo', 'bar');
console.log(result ? 'Found' : 'Not Found')
1
répondu Steven Spungin 2018-08-15 11:43:05

J'ai remarqué que si l'utilisateur entre une chaîne de texte mais quitte l'entrée sans sélectionner l'une des options de saisie semi-automatique, Aucune valeur n'est définie dans l'entrée cachée, même si la chaîne coïncide avec une dans le tableau. Donc, avec l'aide des autres réponses j'ai fait ceci:

var $local_source = [{
        value: 1,
        label: "c++"
    }, {
        value: 2,
        label: "java"
    }, {
        value: 3,
        label: "php"
    }, {
        value: 4,
        label: "coldfusion"
    }, {
        value: 5,
        label: "javascript"
    }, {
        value: 6,
        label: "asp"
    }, {
        value: 7,
        label: "ruby"
    }];
    $('#search-fld').autocomplete({
        source: $local_source,
        select: function (event, ui) {
            $("#search-fld").val(ui.item.label); // display the selected text
            $("#search-fldID").val(ui.item.value); // save selected id to hidden input
            return false;
        },
        change: function( event, ui ) {

            var isInArray = false;

            $local_source.forEach(function(element, index){

                if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) {
                    isInArray = true;
                    $("#search-fld").val(element.label); // display the selected text
                    $("#search-fldID").val(element.value); // save selected id to hidden input
                    console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value);
                };

            });

            if(!isInArray){

                $("#search-fld").val(''); // display the selected text
                $( "#search-fldID" ).val( ui.item? ui.item.value : 0 );

            }
        } 
-1
répondu Ago 2014-12-03 12:48:07