Попытка загрузить веб-страницу while в виде одного файла путем преобразования элементов img src в base64 - PullRequest
0 голосов
/ 19 апреля 2019

Я работаю над навыком для небольшого MI-проекта на моем сайте. В настоящее время у этого MI есть навык, который позволяет ему клонировать URL, однако изображения не будут работать без подключения к Интернету, поэтому я пытаюсь обнаружить все изображения на странице, преобразовать их в base 64 и вставить их непосредственно в html

function getimages($string) {
    $string = trim(preg_replace('/\s+/', ' ', $string));
$string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_src("$1") . "\'"', $string);
return $string2;
}

function convert_src($url) {
    $image = file_get_contents($url);
if ($image !== false){
    return 'data:'.mime_content_type($url).';base64,'.base64_encode($image);
}
}

Если html-страница передается в getimages, она должна проходить через все элементы src и передавать их URL-адреса для convert_src, который затем должен загрузить файл в память, преобразовать в base64, а затем заменить исходный тег изображения новым закодированным base64. версия. Этого не происходит, в моих экспериментах либо вся страница возвращается пустой / пустой, URL-адреса изображений не распознаются и не обрабатываются, либо изображения полностью исчезают.

Пожалуйста, помогите, я борюсь здесь, в то же время я буду пытаться самостоятельно, но у меня очень мало опыта с функциями preg.

1 Ответ

0 голосов
/ 19 апреля 2019

Это решение не завершено, но оно будет загружать и вставлять (почти) все простые / прямые ссылки на файлы изображений в строку в кодировке base64, заменяя оригинальный атрибут src.

Я снова застрялТеперь, код, который у меня есть, не будет обрабатывать сложные URL, такие как ссылки на изображения из Википедии и ссылки на изображения с данными запроса.Я полагаю, что мой метод обнаружения, если данные уже закодированы в base64, как-то срабатывает для некоторых из этих сложных URL-адресов.

Вот что у меня есть

function getimages($string) {
    $html = $string;
    $html = str_replace("https://", "http://", $html);
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
        $src = $image->getAttribute('src');
        if (strpos($src, 'data:image/') === 0 ) {
        $type = pathinfo($src, PATHINFO_EXTENSION);
        $arrContextOptions=array(
    "ssl"=>array(
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);  
        $data = file_get_contents($src, false, stream_context_create($arrContextOptions));
        $base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
        $image->setAttribute("src", $base64);
        }
        $image->removeAttribute("srcset");
}
$html = $dom->saveHTML();
return $html;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...