2016-12-13 2 views
3

Я пытаюсь узнать задом системы шаблонов, создав у себя, и я ударил шишка ...Regex чтобы соответствовать {@ раскладка = ххх}

Я хочу, чтобы настроить мой шаблон следующим образом:

{@layout=layoutname} 

{@content} 
<p>This is a paragraph</p> 
{@endcontent} 

Но я не знаю, как соответствовать {@layout= и получить имя макета.

Я пробовал: if (preg_match('/(\{\@layout=[a-z]+\})+/', $string, $matches)) { который работает ... вид. Я хочу проверить, загружено ли больше 1 макета, чтобы предотвратить ошибки в длинных файлах, и хотите подсчитать, сколько совпадений $ у меня есть и возвратить ошибку, если найдено более 1 совпадения, но вместо того, чтобы получать все найденные макеты, он возвращает то же самое макет дважды:

Строка используется:

{@layout=app} 

{@layout=main} 

{@content} 
    <h1>{[username]} profile</h1> 
    <img src="{[photoURL]}" class="photo" alt="{[name]}" width="100" height="100"/> 
    <b>Name:</b> {[name]}<br /> 
    <b>Age:</b> {[age]}<br /> 
    <b>Location:</b> {[location]}<br /> 
{@endcontent} 

и используя это выражение, я получаю:

Array ([0] => {@layout=app} [1] => {@layout=app})

может кто-то пожалуйста, помогите мне найти регулярное выражение?

+2

Вы должны использовать 'preg_match_all' найти несколько совпадений. Два элемента в вашем массиве указывают на полное совпадение (0) и первую группу захвата (1) матча. –

+0

Итак, как мне изменить его, чтобы возвращать только имена макетов? –

+0

Также. @SebastianProske, не могли бы вы написать его как ответ, чтобы я мог его принять? :) –

ответ

1

Вам нужно использовать preg_match_all, чтобы получить несколько совпадений в одной строке. В этом случае вы хотите проверить $matches[1], который будет массивом результатов группы захвата. Если у вас несколько макетов, у него будет более одного элемента, поэтому, если это так, вы знаете, что существует более одного объявления макета.

Я бы также изменил ваше регулярное выражение на /\{\@layout=([a-z]+)\}/, которое будет захватывать только имя макета. $matches будет выглядеть следующим образом:

array(2) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(20) "{@layout=layoutname}" 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    string(10) "layoutname" 
    } 
} 

Так что если count($matches[1]) > 1, вы знаете, что есть более чем одна декларация макета. В противном случае $matches[1][0] - ваше имя макета.

+0

Спасибо, понял это в любом случае : D –

0

Благодаря @SebastianProske я нашел то, что искал:

if (preg_match_all('/\{\@layout=([a-zA-Z0-9]+)*\}/', $string, $matches)) {

, что является правильным, если, что возвращает также имя и все матчи.

Спасибо за ваше время, Ares D.

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