PHP正则匹配:如何用preg_match/preg_match_all提取Data URI数组
如何用PHP提取字符串中所有Data URI并转换为文件?
要提取字符串里的所有Data URI,你必须使用preg_match_all——因为preg_match只会返回第一个匹配到的结果,而我们需要获取全部匹配项组成的数组。下面是完整的实现方案:
完整代码示例
<?php $string = '<img src="data:image/png;base64,FAKEIMAGE0XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 0" /><img src="data:image/png;base64,FAKEIMAGE1XXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 1" /><img src="data:image/png;base64,FAKEIMAGE2XXXXXXXAKJDBFLASDGFSDGAFJLSD==" alt="Fake img 2" />'; // 正则表达式匹配所有Data URI $pattern = '/data:image\/[^;]+;base64,[^\"]+/'; preg_match_all($pattern, $string, $matches); // $matches[0] 就是所有匹配到的Data URI数组 $dataUris = $matches[0]; // 遍历数组,将每个Data URI转换为文件 foreach ($dataUris as $index => $dataUri) { // 拆分Data URI的结构:[类型部分],[base64内容] list($typePart, $base64Content) = explode(',', $dataUri, 2); // 提取文件扩展名(比如从data:image/png;base64里拿到png) preg_match('/image\/([^;]+)/', $typePart, $extMatches); $extension = $extMatches[1] ?? 'png'; // 解码base64内容 $imageData = base64_decode($base64Content); // 检查解码是否成功 if ($imageData === false) { echo "第{$index}个Data URI解码失败\n"; continue; } // 生成文件名并保存 $filename = "image_{$index}.{$extension}"; file_put_contents($filename, $imageData); echo "文件 {$filename} 已成功保存\n"; } ?>
关键细节说明
正则表达式
/data:image\/[^;]+;base64,[^\"]+/的含义:data:image\/:匹配Data URI的固定开头部分[^;]+:匹配图片类型(比如png、jpeg、gif等),直到遇到分号为止;base64,:匹配base64编码的标识部分[^\"]+:匹配base64编码的内容,直到遇到双引号(因为src属性用双引号包裹)
为什么用
preg_match_all:
这个函数会把所有符合正则规则的结果都收集到$matches数组中,而preg_match只会返回第一个匹配项,完全满足你“获取所有匹配成功的结果数组”的需求。文件转换逻辑:
我们先拆分Data URI的类型和内容部分,提取文件扩展名,解码base64内容后,用file_put_contents保存为本地文件,同时加入了解码失败的错误处理,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Denver Chiwakira
相关产品推荐
相关产品推荐

