#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня есть список имен, и мне нужна функция, позволяющая пользователю фильтровать их с использованием подстановочных знаков * и ? (любая строка и любой символ.) Я знаю, что мне нужно очистить пользовательский ввод, чтобы избежать синтаксических инъекций (преднамеренных или случайных), но я не знаю, сколько мне нужно будет очистить.
Для чего мне нужно заменить * и? из пользовательского ввода?
var names = [...];
var userInput = field.value;
/* Replace * and ? for their equivalent in regexp */
userInput = userInput.replaceAll(...);
userInput = userInput.replaceAll(...);
/* clean the input */
userInput = userInput.replaceAll(...);
userInput = userInput.replaceAll(...);
...
var regex = new Regexp(userInput);
var matches = [];
for (name in names) {
if (regex.test(name)) {
matches.push(name);
}
}
/* Show the results */
Спасибо.
Ответ №1:
function globToRegex (glob) {
var specialChars = "\^$* ?.()|{}[]";
var regexChars = ["^"];
for (var i = 0; i < glob.length; i) {
var c = glob.charAt(i);
switch (c) {
case '?':
regexChars.push(".");
break;
case '*':
regexChars.push(".*");
break;
default:
if (specialChars.indexOf(c) >= 0) {
regexChars.push("\");
}
regexChars.push(c);
}
}
regexChars.push("$");
return new RegExp(regexChars.join(""));
}
Комментарии:
1. Спасибо за публикацию этого метода. Я просто расширил его для необязательной нечувствительности к регистру, поэтому мои последние две строки гласят: if (нечувствительный) { modifiers = ‘i’}; возвращает новое регулярное выражение(regexChars.join(«»),модификаторы);
Ответ №2:
Хм, я действительно не думаю, что здесь нужно что-то чистить. Если пользователь не введет допустимое регулярное выражение, new RegExp(userInput)
произойдет сбой, оно никогда не будет eval()
соответствовать строке.