用 preg_match_all() 处理多文档 yaml 的核心难点在于:--- 分隔符需用 /^---\s*$(?=\s)/m 精准切分,避免误匹配字符串中的 ---;提取 image: 等字段要兼容换行缩进和引号;嵌套结构(如 env 列表)必须分步提取或改用 yaml_parse()。

用 preg_match_all() 处理多文档 YAML 的核心难点
YAML 文件里出现 --- 分隔多个文档时,直接对整个字符串跑 preg_match() 会失败——它默认只匹配第一个文档,后续的 --- 后内容被忽略。这不是正则写错了,而是函数行为限制:单次调用不跨文档边界。
---\s*(?=\S) 是安全切分多文档的锚点
不能简单用 explode('---', $yaml),因为值里可能含 ---(比如注释、字符串字面量)。必须用正则识别“真正起始的新文档”:
-
---必须独占一行(前后是换行或文件头/尾) - 后跟非空白字符(排除空文档或纯注释块)
- 推荐模式:
/^---\s*$(?=\S)/m,m修饰符让^和$匹配每行首尾
切分后,每个子文档再单独进正则提取,避免跨文档污染。
提取 image: 字段时,要防 YAML 键缩进和冒号后空格干扰
Kubernetes 配置中 image: 可能出现在任意缩进层级,且冒号后常有空格或换行。硬写 /image:\s*(\S+)/ 会漏掉换行后值(如 image: \n nginx:1.20)。
- 用
/image:\s*(?:\n\s+)?(\S+)/支持换行+缩进场景 - 更健壮的写法:
/image:\s*(?:\n\s+)?["']?([^"'\n]+)["']?/,兼容带引号的镜像名 - 注意:不要用
.*跨行匹配,除非加s修饰符;但s会让.匹配换行,易过度捕获
嵌套结构(如 env: 列表)不适合单层正则穷举
遇到 env: 下带 - name: DB_HOST 的列表,别试图用一个正则抓全。正则不擅长解析嵌套层级:
- 先用
preg_match()定位到env:所在行及后续缩进块范围 - 再对这个子块用
preg_match_all('/- name:\s*(\S+)\s*value:\s*(\S+)/')提取键值对 - 若值含换行或复杂结构(如
valueFrom:),立刻切换到yaml_parse()(需ext-yaml扩展)
正则只该用于扁平字段提取;一旦出现缩进嵌套、列表、映射混合,就是它该退场的信号。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











