Я создаю простой механизм шаблонов (в 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];