2016-10-25 7 views
1

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

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

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

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

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

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

/[{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, чтобы соответствовать любому из этих строк (в их entirity)

{loop var=menu[0]} 

{loop var=menu_main} 

{loop var=__menu} 

{loop var=MenuMain} 

Благодарим за внимание.

+0

Пожалуйста, пост четкого образца желаемого ** выхода **. –

+0

всего лишь один момент, пожалуйста, работая над ним – Nate

+0

там вы идете, мой желаемый ввод и вывод – Nate

ответ

0

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

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

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

enter image description here

Если вы хотите захватить {рамочную переменная = ххххх} Вам нужно это:

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

Я ищу захватить {loop var = something_Here [1]}, а не какую-либо комбинацию «menu_main», что-то вроде 'code' $ string = 'dontcaptureth {loop var = menu [0]} dontcapturethis'; preg_match ('/ {loop var = ([] [\ w] +)} /', $ string, $ matches); var_dump (соответствует $); 'code', который возвращает полную строку (hooray!) и" menu [0] ", есть ли способ предотвратить его возврат" menu [0] "? кстати, я использую php preg_match – Nate

+0

Извините, я не получаю то, что вы хотите захватить. Вы говорите, что хотите определить, существует ли в коде шаблон {loop var = xxxxxxxx}, но не фиксирует xxxxxxx (или что-то еще) как группу? – useyourillusiontoo

0

Вы злоупотребляя квадратные скобки, которые указывают только single character. Попробуйте использовать ресурс, такой как 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]; 
Смежные вопросы