Comment puis-je effectuer un match Javascript avec un modèle qui dépend d'une variable?
-
18-09-2019 - |
Question
La mise en œuvre actuelle de Remy de Sharp plug-in suggestion tag jQuery de vérifie uniquement les matchs au début d'une balise. Par exemple, en tapant « Photoshop » ne retournera pas une balise nommée « Adobe Photoshop ».
Par défaut, la recherche est sensible à la casse. Je l'ai légèrement modifié pour réduire les espaces en excès et ignorer la casse:
for (i = 0; i < tagsToSearch.length; i++) {
if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) === 0) {
matches.push(tagsToSearch[i]);
}
}
Ce que j'ai essayé de faire est de modifier ce nouveau pouvoir revenir « Adobe Photoshop » lorsque les types d'utilisateur dans « Photoshop ». Je l'ai essayé d'utiliser match
, mais je ne peux pas sembler le faire fonctionner lorsqu'une variable est présente dans le motif:
for (i = 0; i < tagsToSearch.length; i++) {
var ctag = jQuery.trim(currentTag.tag);
if (tagsToSearch[i].match("/" + ctag + "/i")) { // this never matches, presumably because of the variable 'ctag'
matches.push(tagsToSearch[i]);
}
}
Quelle est la syntaxe correcte pour effectuer une recherche de regex de cette manière?
La solution
Si vous voulez faire regex dynamiquement en JavaScript, vous devez utiliser le objet RegExp . Je crois que votre code ressemblerait à ceci (ont pas testé, pas sûr, mais bonne idée générale):
for (i = 0; i < tagsToSearch.length; i++) {
var ctag = jQuery.trim(currentTag.tag);
var regex = new RegExp(ctag, "i")
if (tagsToSearch[i].match(regex)) {
matches.push(tagsToSearch[i]);
}
}
Autres conseils
Au lieu de
"/" + ctag + "/i"
Utilisez
new RegExp(ctag, "i")
Vous pouvez aussi continuer à utiliser indexOf, il suffit de changer votre === 0 à> = 0:
for (i = 0; i < tagsToSearch.length; i++) {
if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) >= 0) {
matches.push(tagsToSearch[i]);
}
}
Mais là encore, je peux me tromper.