PHP中preg_match_all匹配多行花括号内容失败求助
解决PHP preg_match_all跨多行匹配{...}的问题
你的问题核心在于正则对换行的处理逻辑错误:
- 原正则中的
.默认不匹配换行符,导致跨多行的{...}项无法被完整匹配; - 若盲目添加换行匹配规则却误用贪婪匹配,会导致整个字符串被当作单个匹配项。
正确方案1:开启DOTALL模式的非贪婪匹配
修改正则,添加s修饰符(让.匹配包括换行在内的所有字符),同时保留非贪婪的.*?,确保匹配到最近的}就停止:
preg_match_all('/\{(.*?)\}/s', $message, $match);
这个写法会精准识别每个独立的{...}块,包括最后那个跨多行的内容——非贪婪匹配会在遇到第一个}时终止当前匹配,s修饰符让.可以覆盖换行内容。
更严谨的方案2:匹配不含嵌套{/}的内容
如果你的模板内容里不会出现嵌套的{或},可以用字符类直接匹配所有非{和}的字符,这个写法甚至不需要s修饰符(字符类默认包含换行):
preg_match_all('/\{([^{}]*)\}/', $message, $match);
这个正则逻辑更清晰,明确只匹配{和}之间不包含这两个符号的内容,避免意外的嵌套匹配问题。
效果验证
使用上述任意一种正则,都能得到你需要的8个匹配项,包括最后那个包含HTML、换行的完整内容块。
内容的提问来源于stack exchange,提问作者Dannymh
相关产品推荐
相关产品推荐

