Я пытался использовать простую операцию jQuery для динамического сопоставления и сохранения всех тегов привязки и их текстов на странице. Но я обнаружил странное поведение. Когда вы используете match () или exec (), если вы определяете иглу как отдельный объект RegExp или переменную шаблона, тогда ваш запрос соответствует только одному экземпляру среди десятков в стоге сена.
И если вы назначите образец таким образом
match(/needle/gi)
, тогда это соответствует каждому экземпляру иглы.
Вот мой код.
Вы даже можете запустить Firebug и попробовать этот код прямо здесь, на этой странице.
var a = {'text':'','parent':[]};
$("a").each(function(i,n) {
var module = $.trim($(n).text());
a.text += module.toLowerCase() + ',' + i + ',';
a.parent.push($(n).parent().parent());
});
var stringLowerCase = 'b';
var regex = new RegExp(stringLowerCase, "gi");
//console.log(a.text);
console.log("regex 1: ", regex.exec(a.text));
var regex2 = "/" + stringLowerCase + "/";
console.log("regex 2: ", a.text.match(regex2));
console.log("regex 3: ", a.text.match(/b/gi));
Для меня это возвращается:
regex 1: ["b"]
regex 2: null
regex 3: ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"]
Может кто-нибудь объяснить корень этого поведения?
EDIT : Я забыл упомянуть, что для regex1 не имеет значения, добавляете ли вы флаги "gi" для глобального и нечувствительного к регистру соответствия. Он по-прежнему возвращает только одно совпадение.
EDIT2 : Решил мою собственную проблему. Я до сих пор не знаю, почему один regex1 соответствует только одному экземпляру, но мне удалось сопоставить все экземпляры, используя match () и regex1.
Так что ... это соответствует всем и динамически!
var regex = new RegExp(stringLowerCase, "gi");
console.log("regex 2: ", a.text.match(regex));