Матч шаблон внутри шаблона - PullRequest
0 голосов
/ 05 января 2011

Я пытаюсь сопоставить любые элементы в квадратных скобках внутри тегов <sup>.

Мое регулярное выражение слишком жадное, начиная с первого тега <sup> и заканчивая последним тегом </sup>.

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

Пример html:

<sup>[this should be gone]</sup>
<sup>but this should stay</sup>
<sup>this should [ also stay</sup>
[and this as well]
<sup><a href="#">[but this should definitely go]</a></sup>

Есть идеи почему?

Спасибо!

РЕДАКТИРОВАТЬ: Я полагаю, что эти ответы имеют смысл.Я проанализировал большую часть HTML без регулярных выражений;Я просто подумал, что этот конкретный пример будет работать с регулярным выражением, потому что он будет делать следующее:

  1. см. Первый тег <sup>
  2. найти первый экземпляр </sup>
  3. поиск внутри (wild) (скобка) (wild) (закрывающая скобка) (wild)

Ответы [ 5 ]

2 голосов
/ 05 января 2011

Вы действительно не можете этого сделать. Невозможно проанализировать HTMl с регулярными выражениями , потому что регулярные выражения могут соответствовать только регулярным языкам;эти языки являются более простым подмножеством реальных языков, которые мы используем.Одним очень распространенным не -регулярным языком является язык Дейка со сбалансированными скобками;невозможно сопоставить правильно вложенные скобки с регулярными выражениями.И HTML, если подумать, такой же, как и теги, заменяющие скобки.Таким образом, сопоставление (a) правильно вложенных тегов sup невозможно, и (b) сопоставление сбалансированных фигурных скобок невозможно.Я сам не использую PHP, но знаю, что у него есть доступ к HTML DOM;Я бы рекомендовал использовать это вместо.Затем отфильтруйте это для каждого тега sup и проверьте каждый внутренний текст.Если вы хотите поймать только те теги, чей внутренний текст равен [...], где ... не содержит квадратных скобок, вы можете использовать ^\[[^\]]+\]$ в качестве регулярного выражения;если вы хотите реальное вложение, необходима более сложная проверка.

0 голосов
/ 05 января 2011

использование регулярного выражения для анализа html обычно не очень хорошая идея.

см. Разбор HTML-кода Путь Ктулху

0 голосов
/ 05 января 2011

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

лучший способ, о котором все уже упоминали, будет использовать объект DOM для предварительного анализа HTML.

0 голосов
/ 05 января 2011

Разве это не нормальное поведение?Вы указали опцию для своего регулярного выражения?

0 голосов
/ 05 января 2011

Если бы вы требовали специально удалить любой текст внутри "<sup>[" и "]</sup>", то с вами все будет в порядке. Но в последнем примере вы также хотите учесть вложенные теги и, возможно, произвольные вложенные теги. Поэтому я должен напомнить вам ...

Не анализируйте html с регулярным выражением!

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