2016-02-21 2 views
2

Мне нужен шаблон для функции php preg_match_all, чтобы возвращать совпадения, которые находятся внутри двойных фигурных скобок, и находятся между '< body>' и '</body>' strings.preg_match_all возвращает только одно совпадение

Я попытался создать такой шаблон, но он вернул только одно совпадение. Я ожидал, что он вернется в «понедельник» и «вторник», но он вернется только во вторник.

Вот картина

/<body>(.)*{{(?<DAY>.*?)}}(.)*<\/body>/s 

Вот строка для тестирования:

<body> 
s{s ds 
ds{{Monday}}ds 
s 
dsd}{s 
ds{{Tuesday}}dsd sdsd 
d{}sd}s 


} 
{ 
fdsa dsafasd 
</body> 

Спасибо

ответ

2

Причина это только возвращающиеся один матч, потому что вы соответствие с начала <body> элемента закрытия </body> элемента с только одна группа захвата.

Чтобы обойти эту проблему, вы можете использовать \G anchor для продолжения согласования в конце предыдущего матча:

/<body>|(?!^)\G(.*?){{(?<DAY>.*?)}}(?=.*<\/body>)/s 

Live Example:

preg_match_all("/<body>|(?!^)\G(.*?){{(?<DAY>.*?)}}(?=.*<\/body>)/s", $input, $matches, PREG_SET_ORDER); 

foreach ($matches as $match) { 
    if (isset($match['DAY'])) { 
     echo $match['DAY']; 
    } 
} 

выхода на основе введенного вами :

Понедельник Вторник


Стоит отметить, что если вы знаете, что каждый из этих матчей находятся внутри <body> элемента, вы можете просто просто использовать:

preg_match_all("/{{(?<DAY>.*?)}}/", $input, $matches, PREG_SET_ORDER); 
+0

Нет, матчи бы между телом теги и вне тела. Например. в главном разделе кода веб-страницы. Спасибо за рабочий шаблон. Один вопрос об этой части: «(?! ^)». Означает ли это что-либо, не сопровождаемое началом тестовой строки? – trzczy

+0

@trzczy Якорь '\ G' продолжит совпадение в конце предыдущего совпадения ** или ** будет соответствовать началу в начале строки. Отрицательный lookahead '(?! ^)' Просто препятствует его совпадению в начале, так что совпадение всегда начинается с '' и '\ G' всегда продолжается оттуда. Кажется, что он работает в [этом примере] (http://ideone.com/7yPM0m), если есть совпадения внутри элемента ''. –

+1

Джош, большое вам спасибо за большую помощь! – trzczy

0

Я думаю, что простой способ, чтобы получить текст между тегами в первый шаг. И со вторым регулярным выражением вы получите retrive элементов в фигурных скобках

/({{(Monday|Tuesday)}})+/s 
Смежные вопросы