【问题标题】:How to decode base64 tag <img src> before (or during) the readfile("mypage.html")如何在 readfile("mypage.html") 之前(或期间)解码 base64 标签 <img src>
【发布时间】:2011-11-29 10:09:56
【问题描述】:

我想知道是否可以这样做:

`readfile(base64_decode_only_img_src_tags("mypage.html"));

我一直在寻找解决方案,但没有结果。想法是将html文件的编码行更改为他的解码行,例如:

<img src="data:image/png;base64,**iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEW/v7////+Zw/90AAAAEUlEQVQI12P4z8CAFWEX/Q8Afr8P8erzE9cAAAAASUVORK5CYII=**">

收件人:

<img src="/path/to/images/image.gif">

我知道也许我应该解析代码以检测带有 img src 标记的行,然后解码这些行的 ** 标记部分 **,但我不知道在 readfile 期间该怎么做。

提前致谢。

正如@mario 所说,我正在测试他的代码:

 $newhtml = file_get_contents('newhtml.html');

function data_to_img($match) {
    list(, $img, $type, $base64, $end) = $match;
    $bin = base64_decode($base64);
    $md5 = md5($bin);   // generate a new temporary filename
    $fn = "$md5.$type";
    file_exists($fn) or file_put_contents($fn, $bin);

    return "$img$fn$end";  // new <img> tag
}

如果我尝试回显:

 echo preg_replace_callbak('#(<img[^>]+src=")data:image/(gif|png|jpeg);base64,([\w=+/]+)("[^>]*>)#', "data_to_img", $content);

它适用于上面的 html 示例!现在我正在尝试使用我真正的 html 文件。我注意到 img src 比我提供的示例要长。我手上的img src的真实例子太长了这里就不贴了,所以请鼠标二键点击狗图片和图片信息查看base64代码。非常感谢!!

html file with base64 images

更新:希望这个人对 base64 大型编码和正则表达式有同样的问题

Link to the similiar problem

UPDATE2:马里奥解决了我的问题,非常感谢你。这是 preg_replace_callback 的代码和正则表达式:

echo preg_replace_callback('#(<img\s(?>(?!src=)[^>])*?src=")data:image/(gif|png|jpeg);base64,([\w=+/]++)("[^>]*>)#', "data_to_img", $content);

【问题讨论】:

  • 为什么不直接使用实际图像?
  • 你想做什么?您是否正在尝试使客户端可以从编码的 URI 中读取图像?您是否尝试打开图像服务器端?还是您只想要解码后的 URI 服务器端?
  • 解码图像,保存在你的路径中,指向你的路径
  • 我正在尝试在 textarea(html 编辑器 Web 应用程序)中打开一个 html 文件,但浏览器崩溃了。我认为问题来自以 base64 编码的打开图像(img src 太大),因为如果我添加存储在服务器上的其他图像,它工作得很好。我想解码 base64 行以减少链接的长度。谢谢。

标签: php javascript base64 image


【解决方案1】:

你可以这样做。但这有点违背了目的,您必须注意不要将图像两次解压缩到临时目录中(这意味着)。

echo preg_replace_callback('#(<img\s(?>(?!src=)[^>])*?src=")data:image/(gif|png|jpeg);base64,([\w=+/]++)("[^>]*>)#', "data_to_img", $content);

function data_to_img($match) {
    list(, $img, $type, $base64, $end) = $match;

    $bin = base64_decode($base64);
    $md5 = md5($bin);   // generate a new temporary filename
    $fn = "tmp/img/$md5.$type";
    file_exists($fn) or file_put_contents($fn, $bin);

    return "$img$fn$end";  // new <img> tag
}

(我在这里忽略了无效的** 标记。)

特别是您不能将其与readfile 结合使用,因为您需要自己捕获文件内容来重写它。然后它仍然是一个应该事先应用的任务,而不是针对每个请求的临时任务。

【讨论】:

  • 非常感谢,我正在努力!
  • 您的代码看起来很有用,但一定有一个我找不到的错误.. 可能在模式 '#(]+src=")data:image/(gif |png|jpeg);base64,([\w=]+)("[^>]*>)#'.我明天看看。再次感谢!!
  • 如果您收到错误消息,请说出来。函数名称应为..._callback
  • 谢谢!我将测试结果添加到问题部分。任何帮助表示赞赏。
  • 更改了正则表达式。并使用preg_replace_callback
【解决方案2】:

将读取文件结果加载到变量中并使用此正则表达式

data:image/png;base64,\*\*(.+?)\*\*

【讨论】:

  • 非常感谢,我正在努力!
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多