Регулярные выражения — ссылка на первое совпадение в поиске

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

Я пытаюсь использовать регулярное выражение, чтобы найти все между набором соответствующих тегов в HTML. Это было легко для меня, когда я тестировал статические теги, потому что я мог просто искать все между двумя фрагментами текста, такими как \{myTag\}(someExpression)\{\/myTag\}

Моя проблема связана с тем, что «myTag» может быть чем угодно. Я просто не знаю, как (или возможно ли вообще) сопоставить начальный тег с конечным тегом, когда этот текст является переменным.

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

Сначала я подумал, что, возможно, я мог бы написать что-то вроде: \{(.*?)\}(someExpression)\{\/${1}\}, но я понятия не имею, будет ли это работать на самом деле и возможно ли это (не говоря уже о том, правильно ли это).

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

И если это имеет какое-то значение, язык, на котором я это делаю, — это PHP с функцией preg_replace_callback.

Любая помощь будет принята с благодарностью.


person Lucas    schedule 03.05.2011    source источник


Ответы (2)


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

\{([^}]*)\}(someExpression)\{\/\1\}

но имейте в виду, что вам нужно убедиться, что someExpression также не соответствует закрывающим тегам (как, например, .*). И, конечно же, если теги вложены, то все ставки сняты, и вам понадобится другое регулярное выражение (или синтаксический анализатор).

person Tim Pietzcker    schedule 03.05.2011
comment
+1 за упоминание о вложенных тегах и ограничениях регулярных выражений :) - person alex; 03.05.2011
comment
PCRE поддерживает рекурсивные шаблоны. - person Gumbo; 03.05.2011

Это как бы зависит от вашего случая. Если вы знаете, что это всего лишь фрагмент HTML и есть определенный шаблон, по которому вы можете выполнить поиск в HTML, вы можете использовать регулярное выражение для поиска и замены шаблона, но мне кажется, что вы пытаетесь проанализировать HTML. Таким образом, проблема была бы в том, если бы у вас был вложенный тег. Вы должны проверить http://php.net/manual/en/function.preg-replace.php, потому что эта функция кажется гораздо более простой в использовании, чем функция с обратным вызовом.

В качестве примечания о просмотре регулярных выражений вы можете использовать $i или \i в зависимости от используемого языка. Я не знаю, поддерживает ли регулярное выражение php отслеживание группы.

person gdoubleod    schedule 03.05.2011