Я разрабатываю собственный синтаксический анализатор шаблонов и хочу, чтобы шаблон компилятора
содержимое в php-код с помощью синтаксиса шаблона {php xxx}.
я пытаюсь использовать
preg_replace('/{php\s+([^}]+)*}/', '<?php $1?>', '{php echo 'a' }'); можно работать с одной строкой от {php echo 'a' } до <?php echo 'a' ?>
а затем измените поддержку шаблона с помощью нескольких строк
$content = "
{php print_r([
'foo' => 'bar',
])}
";
echo preg_replace('/{php\s+([^}]+)*}/', '<?php $1?>', $content);
теперь вопрос в том, как поддерживать функцию php в синтаксисе шаблона {php xxx}.
исходное содержимое шаблона:
{php echo yii\bootstrap\Nav::widget([
'options' => ['class' => 'navbar-nav'],
'items' => array_walk($menu, function($data) {
return yii\helpers\ArrayHelper::remove($data, 'items');
}),
]); }
целевой php-код
<?php echo yii\bootstrap\Nav::widget([
'options' => ['class' => 'navbar-nav'],
'items' => array_walk($menu, function($data) {
return yii\helpers\ArrayHelper::remove($data, 'items');
}),
]); ?>
Учтите, что {php echo "text with {$braces['key']}";} Regex — неправильный инструмент для разбора сложных структур.
Последний } всегда закрывается? Если да, то regex101.com/r/0ukTba/1, я думаю, подходит. Если нет, вам нужно предоставить больше примеров и более подробное объяснение.
Это может даже произойти что-то вроде {php $end='}'; $start = '{'; echo "$start something $end";}. Тогда концепция вложения фигурных скобок с использованием рекурсивных выражений также будет нарушена. Вам нужно будет принять во внимание все случаи, такие как строки (одиночные/двойные кавычки, heredoc, nowdoc...) и другие случаи, где может возникнуть закрывающая фигурная скобка.
Вы разрабатываете свой собственный язык шаблонов или полагаетесь на данный?
@ user3783243 у меня это не работает. я обновил вопрос
Вы непонятливы и не отвечаете ни на один вопрос в комментариях.






Как я уже упоминал в комментариях, регулярное выражение — неправильный инструмент для разбора структурированного кода.
Однако, если вы можете гарантировать, что фигурные скобки всегда встречаются попарно и без экранирования, вы можете использовать рекурсивное регулярное выражение:
<?php
declare (strict_types=1);
$subject = <<<'EOS'
<div>{php echo yii\bootstrap\Nav::widget([
'options' => ['class' => 'navbar-nav'],
'items' => array_walk($menu, function($data)
{
if (true)
{
$x = "{}sdf{ {{}{}}{} }";
}
return yii\helpers\ArrayHelper::remove($data, 'items');
}),
]); }</div>
<div>{php echo yii\bootstrap\Nav::widget([
'options' => ['class' => 'navbar-nav'],
'items' => array_walk($menu, function($data)
{
if (true)
{
$x = "{}sdf{ {{}{}}{} }";
}
return yii\helpers\ArrayHelper::remove($data, 'items');
}),
]); }</div>
EOS;
var_dump(preg_replace( '~{php(\s([^{}]|{([^{}]*(?2))*})*)}~suU', '<?php\1?>', $subject));
Протестируйте онлайн: https://regex101.com/r/hGqVeq/2
это работа для меня. Большое спасибо за описание и пример.
вам нужно регулярное выражение для {php some_text} ?\