Как я могу проверить, содержит ли HTML-документ теги скрипта, которые не являются пустыми, используя регулярное выражение - PullRequest
3 голосов
/ 08 июня 2010

Я пытаюсь проверить, содержит ли html-документ теги сценария, которые не являются пустыми, с помощью регулярных выражений. Регулярное выражение должно соответствовать любому тегу сценария с содержимым, отличным от пробелов или разрывов строк.

Я пытался

<script\b[^>]*>[^.+$]</script>

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

Ответы [ 5 ]

7 голосов
/ 08 июня 2010

Не анализируйте HTML с регулярным выражением! Серьезно, в общем случае это буквально невозможно. Почему вы хотите использовать регулярное выражение здесь? Было бы гораздо разумнее использовать анализатор HTML, хотя я не могу дать вам никаких конкретных предложений, потому что я не знаю, какой язык вы используете. Например, если вы используете JavaScript DOM, вам нужно что-то вроде следующего:

var scripts     = document.getElementsByTagName('script')
var numScripts  = scripts.length
var textScripts = []
for (var i = 0; i < numScripts; ++i)
  if (scripts[i].text !== '') textScripts.push(scripts[i])

Здесь рассматривается структура HTML для определения свойств тегов сценария, а не грязный текст.


Редактировать 1: Очевидно, вы используете Java. К сожалению, я ничего не знаю о разборе HTML в Java, поэтому не могу дать вам никаких рекомендаций; однако, посмотрите на это, потому что это путь.

4 голосов
/ 08 июня 2010

Regex не подходит для этого. Используйте HTML-парсер . Я могу порекомендовать Jsoup для этого.

Вот начальный пример:

URL url = new URL("http://stackoverflow.com/questions/2993515");
Document document = Jsoup.parse(url, 3000);

Elements scripts = document.select("script");
for (Element script : scripts) {
    String data = script.data();
    if (!data.isEmpty()) {
        System.out.println(data);
    }
}

Jsoup - наименее многословный из всех анализаторов HTML, он предлагает хороший API с поддержкой jQuery-подобных селекторов .

2 голосов
/ 08 июня 2010

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

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

Проблема дополнительно осложняется возможностью комментариев, содержащих теги сценария.

1 голос
0 голосов
/ 08 июня 2010

Используйте TagSoup или другой Java DOM parser , чтобы выяснить это.

Ни при каких обстоятельствах не используйте регулярные выражения для разбора HTML.

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