
本文详解如何用 PHP 的 preg_match 配合精准正则表达式,从 stat 命令的多行文本输出中提取文件名、大小、类型、所有者、所属组、权限、修改时间与创建时间等关键元数据。
本文详解如何用 php 的 `preg_match` 配合精准正则表达式,从 `stat` 命令的多行文本输出中提取文件名、大小、类型、所有者、所属组、权限、修改时间与创建时间等关键元数据。
Linux stat 命令输出结构清晰但格式灵活(含空格、换行和括号),直接按行解析易出错;而使用正则表达式一次性捕获全部字段,既简洁又可靠。以下是一个经过验证、可直接用于生产环境的 PHP 解决方案。
✅ 推荐正则表达式(带命名捕获组)
$pattern = '/
(?:File:\s*\'(?P<file>[^\']*)\')\s+
(?:Size:\s*(?P<size>\d+)).*?
(?:IO Block:\s*\d+\s+(?P<type>[\w\s]+?))\s+
.*?\s+
(?:Access:\s*\((?P<permissions>[\w\/\-\s]+)\))\s+
(?:Uid:\s*\(\s*\d+\s*\/\s*(?P<user>\w+)\))\s+
(?:Gid:\s*\(\s*\d+\s*\/\s*(?P<group>\w+)\)).*?
(?:Modify:\s*(?P<modify>[\d\-:\.\s]+[+-]\d{4}))\s+
(?:Change:\s*(?P<change>[\d\-:\.\s]+[+-]\d{4}))\s+
(?:Birth:\s*(?P<birth>[\d\-:\.\s]+[+-]\d{4}))
/x';
$output = trim($matches['File']),
'size' => (int)$matches['Size'],
'type' => trim($matches['Type']),
'permissions'=> $matches['Permissions'],
'user' => $matches['User'],
'group' => $matches['Group'],
'modify' => $matches['Modify'],
'change' => $matches['Change'],
'birth' => $matches['Birth'],
];
print_r($data);
} else {
echo "Failed to parse stat output.\n";
}</birth></change></modify></group></user></permissions></type></size></file>
⚠️ 关键注意事项
- 空白与换行敏感:stat 输出中的缩进、多余空格和换行符必须被正则正确容忍。本方案使用 .*? 非贪婪匹配跳过无关字段,并启用 /x 修饰符支持注释与空白美化。
- 字段顺序不可依赖:虽然示例中 Modify 在 Change 前,但不同系统或 stat 版本可能调整顺序。本正则严格按关键词(如 Modify:、Change:)定位,不依赖物理位置。
-
Birth(创建时间)兼容性:部分旧版 ext4 或 XFS 可能不支持 Birth 字段(显示为 - 或缺失)。建议在实际使用中增加容错逻辑,例如允许 Birth 组为空或使用 (?:Birth:\s*(?P
[\d\-:\.\s]+[+-]\d{4}))?。 - 权限与用户组解析:Uid: ( 1002/user) 中的用户名可能含连字符(如 www-data)或数字开头(极少见),因此 \w+ 已足够;若需更严谨,可用 [\w.-]+。
- 时区处理建议:捕获的时间字符串(如 2022-06-02 07:54:24.493383727 -0400)可直接传给 DateTime::createFromFormat() 进行标准化处理。
? 总结
该正则方案聚焦实用性和健壮性——它不追求“一行通吃”,而是以语义关键词驱动匹配,兼顾可读性与可维护性。配合 PHP 的命名捕获组((?P
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











