2009-10-14 2 views
0

Я хотел бы воспроизвести (размножать) метод анализа партитур выражения Expression Engine. (Pls не спрашивайте меня, почему это не использовать :))Регуляция регулярных выражений - имитация разбора шаблона выражения Expression Engine

В то время как я в состоянии найти и разобрать простые теги, как

{example_param = "param_value"} 

я не могу разобрать теги, где добавлен закрывающий тег:

{cyclic_param} 
... 
{/cyclic_param} 

Это шаблон я использую:

'/[\{^\/](.*)\}/iU' 

но это возвращает {/ cyclic_param} тоже.

Я знаю, что есть миллиард регулярных выражений наставников там, но это вещь, я не могу понять, когда :((И я не могу понять из источника СЭ)

Как я могу найти открытия и закрытие тегов (с их внутренние блоки тоже) с регулярным выражением в PHP?

спасибо за вашу помощь!

ответ

1
preg_match('~{(\w+)}(.+?){/\1}~s', $r, $m); 

содержание будет в $ м [2].

это не будет хань хотя.

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

$text = " 
    foo {single1=abc} 
    bar {double1} one {/double1} 
    foo {single2=def} 
    bar {double2} two {/double2} 


    "; 

    $tag = '~ 
     {(\w+)}(.+?){/\1} 
     | 
     {(\w+)=(.+?)} 
    ~six'; 

    preg_match_all($tag, $text, $m, PREG_SET_ORDER); 
    foreach($m as $p) { 
     if(isset($p[3])) 
      echo "single $p[3] with param $p[4]\n"; 
     else 
      echo "double $p[1] with content $p[2]\n"; 
    } 
+0

хороший один, но это один не найти одиночные теги. возможно, мне нужно дважды пробежать шаблон? сначала найдите двойные метки, затем снова для одиночных? – fabrik

+0

расширен с оператором OR, он приближается, но пока не все в порядке: ~ \ {(. *) \} | {(. *)} (. +?) {/ \ 1} ~ s – fabrik

+0

это фантастика! Большое спасибо за вас! – fabrik

0

Я думаю, что это правильный для Вас:

'/\{[^\/]*\}/iU' 
+0

этот один возвращает только первый тег только :( – fabrik

Смежные вопросы