Как получить регулярное выражение для сопоставления нескольких тегов сценария? - PullRequest
5 голосов
/ 18 сентября 2009

Я пытаюсь вернуть содержимое любых тегов в тексте. В настоящее время я использую следующее выражение, но оно захватывает только содержимое первого тега и игнорирует все остальные после этого.

Вот пример HTML:

    <script type="text/javascript">
        alert('1');
    </script>

    <div>Test</div>

    <script type="text/javascript">
        alert('2');
    </script>

Мое регулярное выражение выглядит так:

//scripttext contains the sample
re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var scripts  = re.exec(scripttext);

Когда я запускаю это на IE6, он возвращает 2 совпадения. Первый содержит полный тег, второй содержит предупреждение ('1').

Когда я запускаю его на http://www.pagecolumn.com/tool/regtest.htm, он дает мне 2 результата, каждый из которых содержит только теги сценария.

Ответы [ 6 ]

33 голосов
/ 19 сентября 2009

«Проблема» в том, как работает exec. Он соответствует только первому вхождению, но сохраняет текущий индекс (то есть позицию каретки) в свойстве lastIndex регулярного выражения. Чтобы получить все совпадения просто примените регулярное выражение к строке, пока оно не будет совпадать (это довольно распространенный способ сделать это):

var scripttext = ' <script type="text/javascript">\nalert(\'1\');\n</script>\n\n<div>Test</div>\n\n<script type="text/javascript">\nalert(\'2\');\n</script>';

var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;

var match;
while (match = re.exec(scripttext)) {
  // full match is in match[0], whereas captured groups are in ...[1], ...[2], etc.
  console.log(match[1]);
}
4 голосов
/ 20 сентября 2009

Не используйте регулярные выражения для разбора HTML. HTML не является обычным языком. Используйте силу DOM. Это намного проще, потому что это правильный инструмент.

var scripts = document.getElementsByTagName('script');
2 голосов
/ 18 сентября 2009

Попробуйте использовать глобальный флаг:

document.body.innerHTML.match(/<script.*?>([\s\S]*?)<\/script>/gmi)

Редактировать: добавлено несколько строк и регистр символов не учитывается (по очевидным причинам).

0 голосов
/ 04 июня 2012

попробуйте

for each(var x in document.getElementsByTagName('script');
     if (x && x.innerHTML){
          var yourRegex = /http:\/\/\.*\.com/g;
          var matches = yourRegex.exec(x.innerHTML);
             if (matches){
          your code
 }}
0 голосов
/ 19 сентября 2009

В .Net, в PHP есть метод submatch, preg_match_all, который должен решить вашу проблему. В Javascript такого метода нет. Но вы можете сделать сами.

Тест в http://www.pagecolumn.com/tool/regtest.htm

Выберите $ 1элементов метод вернет то, что вы хотите

0 голосов
/ 18 сентября 2009

Первая группа содержит содержимое тегов.

Редактировать: Разве вы не должны окружать регулярное выражение кавычками? Как:

re = "/<script\b[^>]*>([\s\S]*?)<\/script>/gm";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...