You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:11:13