регулярные выражения ловить многострочный скрипт сценарий внутри HTML - PullRequest
0 голосов
/ 23 марта 2012

Мне нужно захватить встроенные теги скрипта внутри HTML-страниц.Регулярное выражение в конечном итоге будет вытеснено из c #.Сейчас я использую Expresso для тестирования.

На данный момент лучше всего:

.*<script.*\r\n(.*\r\n)*\s*</script>

т.е.

  • .*<script поймать тег сценария
  • .*\r\n перехватывать что-либо до конца строки
  • (.*\r\n)* перехватывать другие строки скрипта
  • \s*</script> перехватывать закрывающий скрипт с любым отступом перед

Он захватывает ВСЕ вещи между первым тегом, включая html и другие теги сценария.

Ответы [ 4 ]

4 голосов
/ 25 марта 2012

Два скрипта в одной строке сломают ваше регулярное выражение. Попробуйте это на источнике страницы с вашим вопросом.

Разбор HTML с помощью регулярного выражения - не очень хорошая идея (в комментарии к вашему вопросу есть ссылка, на которую отвечает , почему <center> не может удержаться ); используйте вместо этого HTML-парсер.

Следующий фрагмент кода выбирает узлы <script>, используя HtmlAgilityPack :

var doc = new HtmlDocument();
doc.Load(html);
var scripts = doc.DocumentNode.SelectNodes("//script");

Разве это не проще, чем регулярное выражение?

1 голос
/ 23 марта 2012

В зависимости от того, кого вы спрашиваете, у вас разные проблемы.Либо ваша проблема в том, что вы используете регулярные выражения в html, либо ваши квантификаторы слишком жадные.

Я не знаю, какую проблему вы хотите решить, но есть вероятность, что ваше решение должно заключаться в использовании htmlparser.

Если вы хотите придерживаться регулярных выражений, используйте несвободную версию квантификатора *?.Тогда ваше регулярное выражение будет выглядеть примерно так:

.*<script.*\r\n(.*\r\n)*?\s*</script>

, что означает, что до первого закрывающего тега оно будет совпадать с меньшим количеством строк, сколько необходимо.

1 голос
/ 23 марта 2012

Как насчет включения «точка соответствует всем» и использования чего-то простого:

<script\b[^>]*>(.*?)</script>

Помните, что сопоставление - это не то же самое, что захват.Это должно захватить ($ 1), что находится между тегами.Я сделал быстрый тест, используя http://regexpal.com/

Используя bosinski.com/regex в Eclipse (я знаю, что это не C #), вот мой тестовый файл (сопровождаемый результатами):

<html>
<SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
<script language="fred">
this is the second set of code
</script>
</html>

Результатысоответствия регулярному выражению:

Found 2 match(es):

start=8, end=275
Group(0) = <SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
Group(1) = <!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->

start=277, end=344
Group(0) = <script language="fred">
this is the second set of code
</script>
Group(1) = 
this is the second set of code
0 голосов
/ 08 декабря 2014

Попробуйте это

<(?<tag>script*)[^>]*>(?<content>.*?)<\/\k<tag>>

Замените слово script после <tag> на другое имя элемента, и вы можете использовать его и для других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...