Что-то в моем регулярном выражении не распознает изображения, поданные из местоположения без расширения, как действительные URL - PullRequest
0 голосов
/ 19 апреля 2019

Я работал над небольшим сценарием, предназначенным для упаковки всей веб-страницы в один HTML-файл.Я работал над этим весь день, и до сих пор все изображения, которые имеют правильное расширение, конвертируются и вставляются правильно, однако некоторые изображения, которые не имеют правильного расширения, пропускаются.

Вот мой код

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 (preg_match("|^(https?:)\/\/|i", $src)) {
                $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));
        if (strlen(bin2hex($data))/2 > 1) {
            if (strlen($type) < 3) {
                $type="png";
            }
        $base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
        $image->setAttribute("src", $base64);
        }
        }

        $image->removeAttribute("srcset");
}

$html = $dom->saveHTML();
return $html;
}

Ниже приведен пример URL-адреса изображения, который будет пропущен по

https://encrypted -tbn0.gstatic.com / images? Q = tbn: ANd9GcSTJgMWr6TgV_3mJcF9Q9jRw6K_-oTLMJFXK4HFFX4X4HFX4HF4H

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

1 Ответ

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

Это решено.

Мне пришлось использовать отдельный язык сценариев cgi в моей корзине cgi, вот пример того, как я его кодировал, в aucgi (если вам это нужно, Google - ваш друг)

##WebApp
<?au3
#include <inet.au3>
echo(StringReplace(StringReplace(StringReplace(base64(_InetGetsource((StringReplace($_GET_raw, "url=", "")))), @CR, ""), @LF, ""), @CRLF, ""))
Func base64($vCode, $bEncode = True, $bUrl = False)

    Local $oDM = ObjCreate("Microsoft.XMLDOM")
    If Not IsObj($oDM) Then Return SetError(1, 0, 1)

    Local $oEL = $oDM.createElement("Tmp")
    $oEL.DataType = "bin.base64"

    If $bEncode then
        $oEL.NodeTypedValue = Binary($vCode)
        If Not $bUrl Then Return $oEL.Text
        Return StringReplace(StringReplace(StringReplace($oEL.Text, "+", "-"),"/", "_"), @LF, "")
    Else
        If $bUrl Then $vCode = StringReplace(StringReplace($vCode, "-", "+"), "_", "/")
        $oEL.Text = $vCode
        Return $oEL.NodeTypedValue
    EndIf

EndFunc ;==>base64
?>

Затем в свой php-скрипт я просто добавляю условный оператор, который говорит, что возвращаемые данные являются нулевыми или пустыми, вместо этого сделав запрос через этот скрипт aucgi с file_get_contents

if (strlen(bin2hex($data))/2 > 1) {
            if (strlen($type) < 3) {
                $type="png";
            }
        $base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
        $image->setAttribute("src", $base64);
        } else {
            $base64 = 'data:image/png;base64,' .file_get_contents("http://localhost/cgi-bin/passthrough.au3?url=".$src);
        $image->setAttribute("src", $base64);
        }
...