preg_match_all() 提取子字符串的关键在于正则表达式设计与参数搭配,文中给出数字提取、中文标签识别、html链接文字抽取及键值对解析四类高频模板,并强调编码、修饰符与匹配模式的适配要点。

用 preg_match_all() 提取子字符串,关键不在函数本身,而在正则表达式的设计和参数搭配。下面给出几种高频实用的配置模板,覆盖常见提取场景。
提取所有连续数字
适合解析日志、编号、价格等含纯数字的片段:
$pattern = '/\d+/'; preg_match_all($pattern, $text, $matches); // $matches[0] 是全部匹配到的数字字符串数组
- 使用
\d+匹配一个或多个数字,比[0-9]+更简洁 - 默认不跨行匹配;如需匹配换行符中的数字,加
s修饰符:'/\d+/s' - 若只要首次匹配,改用
preg_match()即可
提取带括号的中文标签(如【重要】)
适用于从文本中识别自定义标记、分类标识:
$pattern = '/【([^】]*)】/'; preg_match_all($pattern, $text, $matches); // $matches[1] 是所有括号内的内容(去掉了【】)
-
【([^】]*)】中的([^】]*)表示“非右括号字符”的任意次匹配,安全避免贪婪越界 - 中文符号需确保源字符串编码为 UTF-8,且 PHP 文件保存为 UTF-8 无 BOM
- 如需忽略大小写或支持全半角括号,可扩展为
/[\[【]([^】\]]*)[\]】]/u,加u修饰符支持 Unicode
提取 HTML 标签中的链接与文字(简易版)
仅用于结构清晰、无嵌套的简单 HTML 片段(生产环境推荐 DOM 解析器):
$pattern = '/<a>]*href=["\']([^"\']*)["\'][^>]*>([^/i'; preg_match_all($pattern, $text, $matches); // $matches[1] 是 href 地址,$matches[2] 是链接文字 </a>
-
[^>]*避免匹配到标签结尾,比.*?更可控 -
i修饰符让匹配忽略大小写(<a></a>或<a></a>都可) - 单引号/双引号都兼容,靠
["\']和反向引用保证成对 - 不处理属性顺序变化、自闭合标签或 JS 动态内容,勿用于不可信 HTML
提取键值对格式(key: value)
适合解析配置片段、日志字段、Markdown 元数据等:
$pattern = '/^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*(.+?)\s*$/m'; preg_match_all($pattern, $text, $matches, PREG_SET_ORDER); // $matches 是二维数组,每个元素形如 ['0' => '完整行', 1 => 'key', 2 => 'value']
-
m修饰符启用多行模式,使^和$匹配每行首尾 -
PREG_SET_ORDER让结果按“每次匹配一组”组织,更易遍历 - 键名限制为合法变量名形式,值部分用
.+?非贪婪捕获,防吞掉后续行 - 开头
\s*和结尾\s*自动清理空格,减少后续 trim
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











