Как декодировать тег base64 <img src> до (или во время) чтения файла («mypage.html») - PullRequest
0 голосов
/ 29 ноября 2011

Я хочу знать, возможно ли сделать что-то вроде этого:

`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 и затем декодируют ** отмеченную часть этих строк **, но я не знаю, как это сделать во время чтения файла.

Заранее спасибо.

Как сказал @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-файл с изображениями base64

ОБНОВЛЕНИЕ: Надеюсь, у этого парня была такая же проблема с большой кодировкой base64 и регулярным выражением

Ссылка на похожую проблему

ОБНОВЛЕНИЕ2: Марио решил мою проблему, большое спасибо, человек.Вот код и регулярное выражение для preg_replace_callback:

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

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Вы могли бы сделать это. Но это как бы отрицательно сказывается на цели, и вам придется позаботиться о том, чтобы дважды не распаковывать изображения во временный каталог (что это будет означать).

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, так как вам нужно захватить содержимое файла самостоятельно, чтобы переписать его. И затем это все еще задача, которую следует применять заранее, а не по каждому запросу.

0 голосов
/ 29 ноября 2011

загрузить результат чтения файла в переменную и использовать это регулярное выражение

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...