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

如何用preg_match_all正确提取所有[ANY_TEXT-pb]格式内容块

修正正则以正确提取[ANY_TEXT-pb]格式内容块

需求

使用preg_match_all()提取字符串中所有符合[ANY_TEXT-pb]格式的内容块,其中ANY_TEXT可指代任意不含]的字符。

当前代码

$content = 'START Text1 [news-block] text2 [title1-pb] text3 text4 [title2-pb] text5 END';
preg_match_all('/\[(.*?)pb\]/si', $content, $codes);
print_r($codes[0]);

期望输出

Array
(
    [0] => [title1-pb]
    [1] => [title2-pb]
)

实际输出

Array
(
    [0] => [news-block] text2 [title1-pb]
    [1] => [title2-pb]
)

问题原因

原正则/\[(.*?)pb\]/si中的.*?是非贪婪匹配,但未限制匹配内容中不能包含],导致会从第一个[开始,一直匹配到第一个出现的pb,中间的其他方括号和文本都会被纳入匹配范围,因此错误捕获了[news-block] text2 [title1-pb]。

解决方案

修改正则表达式,限制方括号内的内容不能包含],确保只匹配单个方括号内以-pb结尾的内容块。修正后的正则为/\[[^]]*-pb\]/si:

  • \[:匹配左方括号
  • [^]]*:匹配任意数量的非]字符(避免跨方括号匹配)
  • -pb\]:匹配-pb和右方括号

修正后的代码

$content = 'START Text1 [news-block] text2 [title1-pb] text3 text4 [title2-pb] text5 END';
preg_match_all('/\[[^]]*-pb\]/si', $content, $codes);
print_r($codes[0]);

运行这段代码后,输出将与期望完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:12:08