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

PHP提取文本中多个占位符仅得1个元素,如何获取2个占位符数组?

如何提取字符串中的多个[[file::xxx]]占位符

嘿,你的问题出在两个关键点上:

  • preg_match 只会抓取第一个符合规则的匹配结果,不会遍历整个字符串找全所有匹配项;
  • 你用的正则表达式 /\[\[.*\]\]/ 是贪婪匹配模式,它会从第一个 [[ 一直匹配到最后一个 ]],直接把两个占位符当成一个整体返回了。

要解决这个问题,只需要做两个简单调整:

  1. 改用 preg_match_all 函数,它会遍历整个字符串,收集所有符合规则的匹配结果;
  2. 把正则改成非贪婪模式,同时精准匹配 [[file::xxx]] 的格式,避免误匹配其他[[...]]内容。

修正后的代码示例

$text = 'is simply dummy text of the printing and [[file::aaa]] typesetting industry. Lorem Ipsum has been the [[file::bbb]] standard dummy text ever since the 1500s.';

// 使用preg_match_all + 非贪婪正则匹配所有占位符
preg_match_all("/\[\[file::.*?\]\]/", $text, $matches);

// 所有匹配到的占位符会存在$matches[0]数组中
print_r($matches[0]);

代码细节解释

  • preg_match_all:专门用于批量匹配,会把所有符合规则的结果存入$matches数组;
  • 正则 /\[\[file::.*?\]\]/:
    • \[\[ 转义匹配占位符的开头标记[[;
    • file:: 精准匹配占位符的固定前缀,避免匹配其他格式的[[...]];
    • .*? 是非贪婪的任意字符匹配,遇到第一个]]就会停止,不会把两个占位符合并成一个;
    • \]\] 转义匹配占位符的结尾标记]]。

运行这段代码后,你会得到包含两个元素的目标数组:

Array
(
    [0] => [[file::aaa]]
    [1] => [[file::bbb]]
)

如果只需要占位符里的aaa、bbb核心内容,可以把正则改成带捕获组的形式:

preg_match_all("/\[\[file::(.*?)\]\]/", $text, $matches);
print_r($matches[1]); // 输出结果:Array([0] => aaa, [1] => bbb)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:29