Почему атрибут setAttribute игнорируется?

Назначение этого кода состоит в том, что HTML-атрибут 'data-original-src' добавляется к тегу img в случае незащищенных URL-адресов http://. Но этот атрибут не генерируется.

Что не так, и какую ошибку я упускаю из виду? Во всяком случае, str_replace() работает как шарм.

public function parse($string) {
    if($this->settings['camo_enabled'] == true) {
        $doc = new DOMDocument();
        $doc->loadHTML($string);
        $images = $doc->getElementsByTagName('img');
        //$imgarray = array();
        foreach ($images as $image) {
            $url = $image->getAttribute('src');
            if(substr($url, 0, 8) != 'https://') {
                $image->setAttribute('data-original-src', $url);
                $camo = $this->proxy_url($url);
                $string = str_replace($image->getAttribute('src'), $camo, $string);
                unset($url, $camo);
            }
        }
    }
    return $string;
}

person Jack Vonderberg    schedule 29.01.2018    source источник


Ответы (1)


Я думаю, что проблема возникает из-за того, что вы забыли изменить переменную $string, которую вы передаете методу, вызывающему saveHTML(), прежде чем вернуть его. Зафиксируйте свои изменения следующим образом:

public function parse($string)
{
    if ($this->settings['camo_enabled'] == true)
    {
        $doc = new DOMDocument();
        $doc->loadHTML($string);
        $images = $doc->getElementsByTagName('img');

        foreach ($images as $image)
        {
            $url = $image->getAttribute('src');

            if (substr($url, 0, 8) != 'https://')
            {
                $image->setAttribute('data-original-src', $url);
                $camo = $this->proxy_url($url);
                $string = str_replace($image->getAttribute('src'), $camo, $string);
                unset($url, $camo);
            }
        }
    }

    $string = $doc->saveHTML(); 
    return $string;

    // The two lines above can also be simply rewritten as:
    // return $doc->saveHTML();
}

Для получения дополнительной информации см. официальную документацию.

Кстати, поскольку вы выполняете изменения как в переменной $string, так и в проанализированном файле HTML, придерживайтесь последнего, изменив эту строку:

$string = str_replace($image->getAttribute('src'), $camo, $string);

в:

$image->setAttribute('src', $camo);
person Tommaso Belluzzo    schedule 29.01.2018
comment
Это не полное решение. Теперь HTML дает атрибут data-original-src. Это кажется правильным, но saveXML дает тип документа и HTML-документ с тегом body вокруг него. Это нарушает действительность моего HTML-документа Любая идея? - person Jack Vonderberg; 30.01.2018
comment
Извините: php.net/manual/en/domdocument.savehtml.php, Я перепутал XML с HTML. Мой ответ отредактирован сейчас. - person Tommaso Belluzzo; 30.01.2018
comment
Нет, теперь я вижу HTML-документ в теле моего HTML-документа, что нарушает мою действительность моего HTML-документа. Обратите внимание, что я заменю часть HTML-документа, а не весь документ! - person Jack Vonderberg; 30.01.2018