You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Regex模板解析器循环处理后残留多余换行符的正则优化咨询

问题根源

你当前使用的foreach正则捕获的body分组包含了foreach起始标签后的换行、层级缩进,以及结束标签前的缩进、换行内容,循环拼接时每次都会重复输出这部分空白字符,最终产生多余空行。

调整方案

1. 修改正则直接剥离多余空白

调整foreach正则,将标签前后的换行、缩进单独匹配,不纳入body捕获范围,同时使用非贪婪匹配避免内容越界:

/<{\s*foreach\(\s*\$(?<variable>\w+)\s+as\s+\$(?<value>\w+)\s*\)\s*}>\s*\R(?<body>.*?)\R\s*<{\s*endforeach\s*}>/si

说明:

  • \s*\R匹配foreach起始标签后的所有空白字符+任意类型换行符,若运行环境不支持\R转义符,可替换为(?:\r\n|\r|\n)
  • 非贪婪匹配.*?避免body内容错误包含后续的endforeach标签
  • 结束标签前的\R\s*匹配body结束后的换行+结束标签前的层级缩进
    调整后捕获的body内容为纯模板片段: <li><{ $user }></li>,不再包含前后多余换行。

2. 可选:处理多余层级缩进

由于foreach标签本身占据一层缩进,其内部的li模板多了一层缩进,可以在替换前对body内容做一次缩进裁剪,匹配预期输出的格式:

// 拿到body后先删除每行开头的4个空格(可根据你实际的缩进单位调整数值)
$body = preg_replace('/^ {4}/m', '', $matches['body']);

3. 调整拼接逻辑

循环拼接替换后的内容时,手动添加统一的换行即可:

$output .= replaceVars($body, $scope) . "\n";

调整后即可输出和预期完全一致的格式。


内容的提问来源于stack exchange,提问作者OnIIcE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:54:04