Question

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

Normalement, ce serait comme ça:

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

Le drapeau / i serait insensible à la casse.

Mais je dois rechercher 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, le moteur de recherche recherchera la chaîne de recherche et non le contenu de 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 y parvenir?

Était-ce utile?

La solution

Oui, utilisez .match plutôt que .search . Le résultat de l'appel .match renverra la chaîne réelle qui a été mise en correspondance, 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');
}

Utiliser une expression régulière comme celle-ci est probablement le moyen le plus simple et le plus évident 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 souhaitez utiliser la chaîne ailleurs (par exemple, entrée utilisateur) ou si vous souhaitez éviter de trop échapper à des métacaractères, il vaut probablement mieux utiliser 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');
}

Autres conseils

Remplacer

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

avec

var result= string.search(new RegExp(searchstring, "i"));

Si vous recherchez simplement une chaîne plutôt qu'une expression régulière plus complexe, vous pouvez utiliser indexOf () - mais n'oubliez pas de commencer par mettre les deux chaînes en minuscule car 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;

Supposons que nous voulions trouver la variable chaîne aiguille dans la variable chaîne haystack . Il y a trois pièges:

  1. Les applications internationalisées doivent éviter string.toUpperCase et string.toLowerCase . Utilisez une expression régulière qui ignore la casse. Par exemple, var needleRegExp = new RegExp (needle, "i"); suivi de needleRegExp.test (haystack) .
  2. En général, vous pourriez ne pas connaître la valeur de needle . Veillez à ce que needle ne contienne aucune expression régulière caractères spéciaux . Echaptez-les en utilisant needle.replace (/[-[\]{ majeur()*+?.,\\^$ | # \ s] / g, "quot"! \\ $ & amp;); .
  3. Dans d'autres cas, si vous souhaitez faire correspondre avec précision aiguille et haystack , en ignorant simplement la casse, veillez à ajouter " ^ " au début et "quot" $ / à la fin de votre constructeur d’expression régulière.

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, "\\<*>amp;"), "i");
var result = needleRegExp.test(haystack);
alert(result);

ES6 +:

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


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

includes () renvoie true si searchString apparaît à une ou plusieurs positions ou false sinon.

Si vous êtes préoccupé par la "classe de caractères non terminée" Dans ce cas, il serait utile de supprimer tous les caractères non alphanumériques:

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');

J'aime la réponse de @ CHR15TO, contrairement aux réponses que j'ai déjà 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 cela serait nécessaire sans montrer comment).

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

Ma réponse [ https://stackoverflow.com/a/38290557/887092] permet de répondre à une question similaire. les suivantes:

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);

Il existe deux méthodes de comparaison insensible à la casse:

  1. Convertissez les chaînes en majuscules, puis comparez-les à l'aide de l'opérateur strict ( === ). Comment l’opérateur traite les opérandes dans les lectures suivantes: http://www.thesstech.com/javascript/relational-logical-operators

  2. Recherche de modèle à l'aide de méthodes de chaîne:

    Utilisez la recherche " recherche " méthode de chaîne pour la recherche insensible à la casse. Lisez à propos de la recherche et d’autres méthodes de chaîne sur: 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>
    

Je le fais souvent et utilise un prototype simple à 5 lignes acceptant les variantes. Il est rapide et fonctionne 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')

Vous pouvez tout mettre en minuscule:

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

J'ai remarqué que si l'utilisateur saisit une chaîne de texte mais laisse celle-ci sans sélectionner aucune des options de saisie semi-automatique, aucune valeur n'est définie dans l'entrée masquée, même si la chaîne coïncide avec une dans le tableau. Donc, avec l'aide des autres réponses, j'ai formulé 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 );

            }
        } 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top