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?
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');
}
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 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;
Supposons que nous voulions trouver la variable string needle
dans la variable string haystack
. Il y a trois pièges:
- les applications internationalisées devraient éviter
string.toUpperCase
etstring.toLowerCase
. Utilisez une expression régulière qui ignore la casse à la place. Par exemple,var needleRegExp = new RegExp(needle, "i");
suivi deneedleRegExp.test(haystack)
. - en général, vous ne connaissez peut-être pas la valeur de
needle
. Veillez à ce queneedle
ne contient aucune expression régulière caractères spéciaux. Échappez-les en utilisantneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
. - dans les autres cas, si vous voulez correspondre précisément
needle
ethaystack
, 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);
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);
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.
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,'');
Il y a deux façons de comparer la casse:
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-
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>
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')
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 );
}
}