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

PHP中preg_match_all匹配多行花括号内容失败求助

解决PHP preg_match_all跨多行匹配{...}的问题

你的问题核心在于正则对换行的处理逻辑错误:

  1. 原正则中的.默认不匹配换行符,导致跨多行的{...}项无法被完整匹配;
  2. 若盲目添加换行匹配规则却误用贪婪匹配,会导致整个字符串被当作单个匹配项。

正确方案1:开启DOTALL模式的非贪婪匹配

修改正则,添加s修饰符(让.匹配包括换行在内的所有字符),同时保留非贪婪的.*?,确保匹配到最近的}就停止:

preg_match_all('/\{(.*?)\}/s', $message, $match);

这个写法会精准识别每个独立的{...}块,包括最后那个跨多行的内容——非贪婪匹配会在遇到第一个}时终止当前匹配,s修饰符让.可以覆盖换行内容。

更严谨的方案2:匹配不含嵌套{/}的内容

如果你的模板内容里不会出现嵌套的{或},可以用字符类直接匹配所有非{和}的字符,这个写法甚至不需要s修饰符(字符类默认包含换行):

preg_match_all('/\{([^{}]*)\}/', $message, $match);

这个正则逻辑更清晰,明确只匹配{和}之间不包含这两个符号的内容,避免意外的嵌套匹配问题。

效果验证

使用上述任意一种正则,都能得到你需要的8个匹配项,包括最后那个包含HTML、换行的完整内容块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:42