PHP Regex для захвата {tag}что-то{/tag}

Я пытаюсь прийти = вверх со строкой регулярного выражения для использования с функциями preg PHP (preg_match и т. д.), и я в тупике:

Как вы сопоставляете эту строку?:

{area-1}some text and maybe a <a href="http://google.com">link</a>.{/area-1}

Я хочу заменить его другой строкой, используя preg_replace.

До сих пор мне удалось идентифицировать первый тег с preg_match следующим образом:

preg_match("/\{(area-[0-9]*)\}/", $mystring);

Спасибо, если вы можете помочь!


person Aaron    schedule 09.02.2010    source источник
comment
@Gumbo Совершенно верно, я отменяю свой комментарий.   -  person Mike B    schedule 09.02.2010


Ответы (2)


Если у вас нет вложенных тегов, должно работать что-то такое простое:

preg_match_all("~{.+?}(.*?){/.+?}~", $mystring, $matches);

Затем ваши результаты можно будет найти в $matches[1].

person Tatu Ulmanen    schedule 09.02.2010
comment
Что делает символ ~ в этом контексте? - person donut; 09.02.2010
comment
@donut Разделители шаблонов, указывающие на начало и конец шаблона. Их можно заменить (афаик) почти любой парой символов. Обычно используется косая черта. - person Mike B; 09.02.2010
comment
Косая черта распространена, но неудобна, если само регулярное выражение содержит косую черту. В этом случае косые черты следует экранировать, а использование других символов позволяет избежать этого. - person Tatu Ulmanen; 09.02.2010
comment
Работает отлично, спасибо! Как включить разрывы строк между тегами? Несоответствие: {область-1} ‹h1›что-то здесь‹/h1› {/область-1} (где h1 находится на новой строке) - person Aaron; 10.02.2010

я бы предложил

preg_match_all("~\{(area-[0-9]*)\}(.*?)\{/\1\}~s", $mystring, $matches);

Это будет работать даже в том случае, если внутри тега area, на который вы смотрите, вложены другие теги.

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

И конечно же содержимое матчей будет в $matches[2], а не $matches[1] как в ответе Тату.

person Tim Pietzcker    schedule 09.02.2010
comment
Вам не нужно экранировать { и }, они интерпретируются как буквальные символы, если только они не являются частью действительного токена (например, {n}). :) - person Tatu Ulmanen; 09.02.2010
comment
Я тоже так думал, но RegexBuddy вставил за меня обратную косую черту, так что я согласился. Буду изучать его дальше. - person Tim Pietzcker; 09.02.2010
comment
Спасибо за помощь ребята. Я попробую. - person Aaron; 10.02.2010
comment
Хм... почему-то у меня это не заработало. - person Aaron; 10.02.2010