PHP提取文本中多个占位符仅得1个元素,如何获取2个占位符数组?
如何提取字符串中的多个[[file::xxx]]占位符
嘿,你的问题出在两个关键点上:
preg_match只会抓取第一个符合规则的匹配结果,不会遍历整个字符串找全所有匹配项;- 你用的正则表达式
/\[\[.*\]\]/是贪婪匹配模式,它会从第一个[[一直匹配到最后一个]],直接把两个占位符当成一个整体返回了。
要解决这个问题,只需要做两个简单调整:
- 改用
preg_match_all函数,它会遍历整个字符串,收集所有符合规则的匹配结果; - 把正则改成非贪婪模式,同时精准匹配
[[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
相关产品推荐
相关产品推荐

