регулярное выражение (javascript) Как сопоставить что-либо между двумя тегами любое количество раз - PullRequest
1 голос
/ 18 мая 2009

Я пытаюсь найти все вхождения элементов на HTML-странице, которые находятся между тегами <nobr> и </nobr>. РЕДАКТИРОВАТЬ: (nobr является примером. Мне нужно найти содержимое между случайными строками, не всегда тегами)

Я пробовал это

var match = /<nobr>(.*?)<\/nobr>/img.exec(document.documentElement.innerHTML);
alert (match);

Но это дает только один случай. + он появляется дважды, один раз с тегами <nobr></nobr> и один раз без них. Мне нужна только версия без тегов.

Ответы [ 6 ]

5 голосов
/ 18 мая 2009

вам нужно сделать это в цикле

var match, re = /<nobr>(.*?)<\/nobr>/img;
while((match = re.exec(document.documentElement.innerHTML)) !== null){
   alert(match[1]);
}
5 голосов
/ 18 мая 2009

используйте DOM

var nobrs = document.getElementsByTagName("nobr")

и затем вы можете перебрать все нобры и извлечь innerHTML или применить к ним любое другое действие.

2 голосов
/ 18 мая 2009

(Поскольку я не могу прокомментировать правильный ответ Рафаэля ...)

exec делает то, что должен делать - находит первое совпадение, возвращает результат в объекте match и настраивает вас для следующего вызова exec. Объект match содержит (с индексом 0) всю строку, совпадающую со всем регулярным выражением. В последующих слотах находятся биты строки, совпадающие с подгруппами в скобках. Так что match[1] содержит бит строки, совпадающий с "(. *?)" В вашем примере.

1 голос
/ 18 мая 2009

требуется несколько шагов, но вы могли бы сделать это так

match = document.documentElement.innerHTML.match(/<nobr>(.*?)<\/nobr>/img)
alert(match)//includes '<nobr>'

match_length = match.length;
for (var i = 0; i < match_length; i++)
{
    var match2 = match[i].match(/<nobr>(.*?)<\/nobr>/im);//same regex without the g option
    alert(match2[1]);
}
1 голос
/ 18 мая 2009

Если используемые вами строки не являются элементами xml и вы используете регулярные выражения, возвращаемое значение можно объяснить заключением в скобки. .exec возвращает всю совпадающую строку, за которой следует содержимое выражений в квадратных скобках.

Если ваш документ содержит:

This is out.<br/>
Bzz. This is in. unBzz.<br/>

тогда

/Bzz.(.*?)unBzz./img.exec(document.documentElement.innerHTML)

Даст вам 'Bzz. Это в. UnBzz. в элементе 0 возвращенного массива и «Это в.» в элементе 1. Попытка отобразить весь массив дает оба списка, разделенных запятыми, потому что это то, что делает JavaScript, чтобы попытаться отобразить его.

Так alert($match[1]); это то, что вы ищете.

1 голос
/ 18 мая 2009

вы можете использовать

while (match = /<nobr>(.*?)<\/nobr>/img.exec("foo <nobr> hello </nobr> bar <nobr> world </nobr> foobar"))
    alert (match[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...