
本文详解如何使用正则表达式从字符串中精准提取位于成对自定义标记(如 [TEST]...[TEST])之间的所有子串,并将其统一存入 PHP 数组,适用于日志解析、模板变量抽取等场景。
本文详解如何使用正则表达式从字符串中精准提取位于成对自定义标记(如 `[test]...[test]`)之间的所有子串,并将其统一存入 php 数组,适用于日志解析、模板变量抽取等场景。
在实际开发中,我们常需从结构化或半结构化文本中提取嵌入在特定分隔符之间的动态内容——例如从富文本中提取自定义标签包裹的变量名、从配置片段中抽取占位值,或解析类似 [TEST]value[TEST] 的标记对。PHP 提供了强大而简洁的 preg_match_all() 函数配合非贪婪正则匹配,可高效完成此类任务。
核心思路是:使用非贪婪量词 +? 匹配两个边界标记之间的最短有效内容,避免跨标记误捕获。以下为推荐实现:
<?php
$text = 'Lorem ipsum dolor sit amet, [TEST]consetetur[TEST] sadipscing elitr, ... [TEST]justo[TEST] duo dolores...';
// 正则模式说明:
// [TEST] → 字面量 "[TEST]"(方括号需转义)
// (.+?) → 捕获组:匹配 1 个或多个任意字符(非贪婪),确保停在最近的结束标记前
// [TEST] → 字面量结束标记
preg_match_all('/[TEST](.+?)[TEST]/', $text, $matches);
// $matches[1] 是第一个捕获组的所有匹配结果(即各段目标内容)
$result = $matches[1];
print_r($result);
// 输出:
// Array
// (
// [0] => consetetur
// [1] => consetetur
// [2] => justo
// )
?>✅ 关键注意事项:
- 必须使用非贪婪匹配 .+?:若写成 .+(贪婪),在多处匹配时可能合并捕获(如将 [TEST]a[TEST]xxx[TEST]b[TEST] 错误匹配为 a[TEST]xxx[TEST]b);
- 边界符号需正确转义:[ 和 ] 在正则中有特殊含义,必须写作 [ 和 ];
- 区分大小写与全局性:本例默认区分大小写;如需忽略大小写,可在正则末尾添加 i 修饰符,如 /\[TEST](.+?)\[TEST]/i;
- 空内容处理:若允许标记间为空(如 [TEST][TEST]),可将 .+? 改为 .*?,但需注意潜在的空字符串干扰。
该方法轻量、可靠,无需循环拆分或状态机,是处理此类“定界提取”任务的标准实践。结合 array_filter() 或 array_map() 还可进一步清洗(如去空格、去重、类型转换),灵活适配各类业务需求。


















