2012-01-16 3 views
0

В основном я пишу небольшой синтаксический анализатор пар, который использует регулярное выражение для анализа некоторых тегов, в настоящий момент у меня возникают проблемы с сопоставлением нескольких тегов в одном файле.Regex не получает все соответствия

Вот мой текущий шаблон регулярного выражения:

$regex = '#\{if \$([A-Za-z0-9_]+)\}([^{]+)(\{else\})?([^{]+)?\{\/if\}#' 

Я пропускаю что-то здесь?

Вот пример файла шаблона Я пытаюсь разобрать

{if $name} 
    Hi my name is: {$name}. 
{else} 
    No name set. 
{/if} 

{if $male} 
    Gender: Male. 
{else} 
    Gender: Female. 
{/if} 

Вот мой PHP код, как он стоит на данный момент:

<?php 
$tpl_file = file_get_contents('template.tpl'); 
$regex = '#\{if \$([A-Za-z0-9_]+)\}([^{]+)(\{else\})?([^{]+)?\{\/if\}#'; 

if (preg_match_all($regex, $tpl_file, $matches)) { 
    print_r($matches); 
} 
?> 

Любая помощь очень ценится. Cheers

+0

/u переключатель для ungreedy –

+0

Показать свой PHP-код. –

+0

'(\ {else \})? ([^ {] +)?' <- это звучит не так: вы хотите, чтобы блок «все остальное блокировал необязательно», здесь вы делаете «else» необязательным или что-либо, что не является '{'. Вы хотите поместить все это в одну группу, а не две отдельные группы. – fge

ответ

1

Вы не должны делать такой синтаксический анализатор с использованием регулярного выражения. Это всего лишь not possible. В любом случае, как сказал Фрэнсис, если вы удалите {$ name} из первого блока if, он будет соответствовать вашему существующему коду.

1

Regex трагически, трагически плохо справляется с соответствующими вложенными затворами. Все, что связано с начальными и конечными структурами, - это замыкания и набивание их друг в друга или их взаимодействие с мета-уровнями очень сложно.

См. Главный ответ на этот пост более конкретно о (X) HTML RegEx match open tags except XHTML self-contained tags, а затем подумайте, что вы в основном заново изобрели синтаксис процедуры-XML-типа с разными фигурными скобками.

Регулярное выражение для «регулярного выражения». К сожалению, для вас «регулярный» не означает, что он регулярно означает, а вместо этого является математической фразой для определенного типа проблем.

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