regex php, строка соответствия с переменным текстом (буквы, цифры, подчеркивание, )

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

{loop var=menu[0]} <li><a href="{link}">{text}</a></li> {/loop} 

где «menu [0]» может быть любой строкой прописных или строчных букв с / без символов подчеркивания, цифр и скобок ([])

 the '{loop var=', '}' and '{/loop}' always stay the same 

Я буду использовать php preg_match для сравнения.

мое регулярное выражение до сих пор (что, вероятно, дико отключено):

 /[{loop var=][\w\s_0-9\[\]][}]/ 

мой php выглядит примерно так:

 function loop($template) { preg_match($pattern, $template, $matches); foreach ($matches as $key => $match) { ... $var = str_replace(array('{loop var=', '}'), '', $match)); $data = $this->get($var); ... $loop_code = str_replace('{' . $var . '}', $data, $loop_code); ... } } 

вход мой шаблон выше, нужный результат ниже

 <ul> <li><a href="<?php print $menu[0][0]['link']; ?>"><?php print $menu[0][0]['text']; ?></a></li> <li><a href="<?php print $menu[0][1]['link']; ?>"><?php print $menu[0][1]['text']; ?></a></li> </ul> 

для этого мне нужно preg_match, чтобы соответствовать любой из этих строк (в их энтузиазме)

 {loop var=menu[0]} {loop var=menu_main} {loop var=__menu} {loop var=MenuMain} 

Спасибо за любой вклад.

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

 $replacement = '/(menu\[\d]|(m|M)enu(_)?(m|M)ain|__menu))/'; 

Я просто не слишком уверен, как вы хотите использовать его и что вы собираетесь его заменить.

введите описание изображения здесь

Если вы также хотите захватить {цикл var = xxxxx}, вам понадобится следующее:

 $replacement = '//({loop var=(menu\[\d]|(m|M)enu(_)?(m|M)ain|__menu)})/'; 

Вы неправильно используете квадратные скобки, которые указывают только на один символ . Попробуйте использовать ресурс, такой как http://regex101.com/, чтобы проверить все.

Вместо того, чтобы удалять str_replace для очистки вещей после этого, просто используйте полную мощность preg_match() :

 $template = "{loop var=menu[0]}\n<li><a href=\"{link}\">{text}</a></li>\n{/loop}"; $pattern = "/\{loop var=([\w\[\]]+)\}(.*?)\{\/loop\}/ism"; preg_match($pattern, $template, $matches); $var_name = $matches[1]; $template_code = $matches[2];