Регулярное выражение для соответствия пустым тегам HTML, которые могут содержать встроенный JSTL? - PullRequest
0 голосов
/ 10 ноября 2009

Я пытаюсь создать регулярное выражение для поиска пустых тегов HTML, которые могут иметь встроенный JSTL. Я использую Perl для моего соответствия.

Пока что я могу сопоставить любой пустой HTML-тег, не содержащий JSTL, со следующим?

/<\w+\b(?!:)[^<]*?>\s*<\/\w+/si

\b(?!:) будет избегать сопоставления с открывающим тегом JTSL, но это не касается того, может ли JSTL находиться внутри самого тега HTML (что допустимо). Я только хочу знать, если этот тег HTML не имеет дочерних элементов (только пробел или пустой). Поэтому я ищу шаблон, который будет соответствовать обоим следующим:

<div id="my-id"> 
</div>
<div class="<c:out var="${my.property}" />"></div>

В настоящее время первый div совпадает. Второго нет. Это выполнимо? Я перепробовал несколько вариантов, используя утверждения о себе, и начинаю думать, что это не так. Однако я не могу сказать наверняка или сформулировать, почему это не так.

Редактировать: Я не пишу что-то, чтобы интерпретировать код, и я не заинтересован в использовании парсера. Я пишу сценарий, чтобы указать на потенциальные проблемы / упущения. И в этот момент, Мне тоже любопытно , чтобы посмотреть, есть ли что-то умное с предвкушением или взглядом за спиной, которое я могу пропустить. Если вас беспокоит, что я пытаюсь "1018 * решить * проблему таким образом", не думайте, что вы ищете решение . Для меня это больше вызов и возможность больше узнать о регулярных выражениях.

Также, если это поможет, вы можете предположить, что html является строгим xhtml.

Ответы [ 5 ]

9 голосов
/ 10 ноября 2009

Попробуйте

<(\w+)(?:\s+\w+="[^"]+(?:"\$[^"]+"[^"]+)?")*>\s*</\1>

Краткое объяснение:

<            # match a '<'
(\w+)        # match one or more a-z, A-Z, 0-9 or '_' and store it in group 1 
(?:          # open non-matching-group 1
  \s+        #   match one or more white space characters 
  \w+        #   match one or more a-z, A-Z, 0-9 or '_'
  ="         #   match '="'
  [^"]+      #   match one or more characters other than '"'
  (?:        #   open non-matching-group 2
    "\$      #     match '"$'
    [^"]+    #     match one or more characters other than '"'
    "        #     match '"'
    [^"]+    #     match one or more characters other than '"'
  )?         #   close non-matching-group 2, and make it optional
  "          #   match '"'
)*           # close non-matching-group 1, and make repeat itself zero or more times
>            # match '>'
\s*          # match zero or more white space characters
</\1>        # match '</X>' where `X` is what is captured in group 1

Это работает для обоих примеров, но я уверен, что кто-то может создать html, который вы хотите сопоставить, но регулярное выражение не найдет его Но после прочтения вашей «правки» вы, кажется, знаете об этом.

2 голосов
/ 10 ноября 2009

Не рекомендуется использовать регулярные выражения для HTML, поскольку существует множество конструкций, которые не могут быть сопоставлены большинством систем регулярных выражений. Также много HTML (в отличие от XHTML) имеет много сложных конструкций. Предлагаю вам использовать HTML-парсер. [Это часто обсуждается в SO, и универсальный ответ - не использовать регулярные выражения).

1 голос
/ 10 ноября 2009

Использование анализатора HTML не означает, что вы интерпретируете или запускаете контент: это означает, что вы преобразуете его из строки символов во вложенный объект. HTML не является регулярным, поэтому регулярные выражения не являются лучшим решением этой проблемы.

См. Документы для HTML :: TreeBuilder как хорошее место для начала. Другие полезные ресурсы включают HTML :: Parser и, конечно, этот сайт . :)

Редактировать: Я буду притворяться, что ваш вопрос не имеет ничего общего с HTML и представляет собой просто интересную загадку регулярных выражений, и, как таковая, обдумает ее ... ... [все еще думает .. редактировать грядущий] (головоломка, брошенная перед лицом действительно потрясающего решения, представленного выше)

0 голосов
/ 02 апреля 2010

основываясь на том, что я прочитал, я считаю, что (?: Это группа без захвата, а не несоответствующая группа, поэтому комментарий к регулярному выражению следует изменить.

Несоответствующая группа будет (?!

0 голосов
/ 11 ноября 2009

Если вы предполагаете, что вы вводите правильный XML, как вы говорите, мой инструмент выбора будет XML :: Twig .

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