如何用单行preg_replace替换{% %}内嵌套的PHP模板{{ }}变量?
单行preg_replace解决方案
直接用preg_replace结合匿名回调就能实现,核心思路是先锁定所有{% ... %}块,再仅对块内的{{ }}变量做替换:
// PHP 7.4+ 箭头函数版本(单行写法) $template = preg_replace('/{%(.*?)%}/s', fn($m) => preg_replace('/{{\s*([\w\-\.]+)\s*}}/', '<?php echo $\\1; ?>', $m[1]), $template);
如果需要兼容PHP 7.4之前的版本,改用普通匿名函数:
$template = preg_replace('/{%(.*?)%}/s', function($m) { return preg_replace('/{{\s*([\w\-\.]+)\s*}}/', '<?php echo $\\1; ?>', $m[1]); }, $template);
原理说明
- 外层正则
/{%(.*?)%}/s:- 精准匹配所有被
{%和%}包裹的内容,.*?采用非贪婪模式,避免误匹配跨多个{% ... %}的内容;s修饰符让.能匹配换行符,支持多行模板块。
- 精准匹配所有被
- 内层替换:
- 对每个捕获到的
{% ... %}内部内容,用正则/{{\s*([\w\-\.]+)\s*}}/捕获变量名(支持带点、下划线的变量,比如item.name),替换为对应的PHP输出语句。
- 对每个捕获到的
示例验证
输入模板:
外部变量不会被替换:{{ varx }} {% 循环内的变量1:{{ item.name }} 循环内的变量2:{{ item-price }} %} 另一个外部变量:{{ var3 }}
替换后输出:
外部变量不会被替换:{{ varx }} 循环内的变量1:<?php echo $item->name; ?> 循环内的变量2:<?php echo $item-price; ?> 另一个外部变量:{{ var3 }}
(注:如果你的变量是数组结构,可将替换语句改成<?php echo $\\1; ?>,比如{{ item[name] }}对应<?php echo $item['name']; ?>,根据实际变量结构调整即可)
内容的提问来源于stack exchange,提问作者Jod
相关产品推荐
相关产品推荐

