Ga naar inhoud
Log in om dit te volgen  
aarclay

setAttribute wordt genegeerd?

Aanbevolen berichten

Ik heb hier een mooie method van een class die non-SSL URLs omzet naar mijn SSL camo-proxy.
Het werkt echt heel mooi, maar... ik merk dat setAttribute op lijn 11 wordt genegeerd.

Ik zie dat er in de img-tag die in de for-loop aangeroepen wordt wel netjes de URL wordt ge-replaced, maar er komt geen nieuw attribuut bij die data-original-src heet?

Waarom negeert hij dit?

Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
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;
    }

?>


Edit:
Ik doe inderdaad niks met $string, dus gebeurt er weinig mee smiley
Ik ga eens kijken of ik de img-tag opnieuw kan opbouwen met alle bestaande attributen.

Deel dit bericht


Link naar bericht
Delen op andere sites
Probeer dit eens:

Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
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;
    }

?>

Deel dit bericht


Link naar bericht
Delen op andere sites
@Milan Wow... Zomaar een hele nieuwe error aangeleerd smiley
Quote:
Fatal error: An iterator cannot be used with foreach by reference in D:**knip**classesCamo.class.php on line 27 (die foreach dus)


Ik ben ook al bezig om met DOMdocument de hele img-tag opnieuw te schrijven, en te replacen inclusief de camo-URL, maar toch was ik benieuwd of het niet makkelijker kan. Met iets van een reference, maar dan op een goede manier. omdat foreach niet lukt.

Deel dit bericht


Link naar bericht
Delen op andere sites
Die werkt allemaal prima, http-urls worden netjes ge-replaced enzo... smiley

Alleen wil ik een extra attribuut meegeven, en daar loop ik op vast, tenzij ik ik fratsen moet uitvoeren om met DOMDocument deze hele tag uit te lezen, opnieuw op te bouwen, maar dat lijkt mij behoorlijk onnodig.

iemand zei dit ook al:
Quote:
Met je str_replace() vervang je alleen de src in de originele HTML ($string). Als je ook het data-original-src terug wilt zien zul je de hele <img> tag moeten vervangen.

True, maar dit lijkt me toch een beetje overdreven.
Zijn er nog alternatieven verder?

Deel dit bericht


Link naar bericht
Delen op andere sites
Aarclay (link):
Die werkt allemaal prima, http-urls worden netjes ge-replaced enzo... smiley

Alleen wil ik een extra attribuut meegeven, en daar loop ik op vast, tenzij ik ik fratsen moet uitvoeren om met DOMDocument deze hele tag uit te lezen, opnieuw op te bouwen, maar dat lijkt mij behoorlijk onnodig.

iemand zei dit ook al:
Klik om eerdere quotes te tonen

True, maar dit lijkt me toch een beetje overdreven.
Zijn er nog alternatieven verder?


Kun je niet gewoon dat domdocument retourneren i.p.v. de string?

Deel dit bericht


Link naar bericht
Delen op andere sites
@Milan: Nah, dat $doc helpt niet, en als ik
Codeblok:
1
$html =  $doc->loadHTML($string);

gebruik met $html i.p.v. $string in de str_replace, dan kan dat inderdaad niet, omdat er een boolean uit komt. Of dacht je wat anders?
Hmmz

Deel dit bericht


Link naar bericht
Delen op andere sites
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
public function parse($string) {
    $doc = new DOMDocument();
    $doc->loadHTML($string);

    if($this->settings[camo_enabled] == true) {
        $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 $doc->saveHTML();
    }

?>

Deel dit bericht


Link naar bericht
Delen op andere sites
Zat ik ook al aan te denken, maar saveHTML maakt meteen een heel HTML-document ervan met de nodige doctype etc... smiley

Deel dit bericht


Link naar bericht
Delen op andere sites
Ik heb dit laatste maanden even op een lager pitje gezet, maar ik wil er mee verder gaan, maar zit nog steeds te worstelen voor een goede oplossing, om alleen de img-tag aan te passen.

De oplossing van Milan werkt wel, echter geeft die saveHTML meteen een onnodige HTML-structuur eromheen met onder meer:
Codeblok:
1
2
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>


Wat dus de validheid van mijn HTML-document sloopt.

Ik heb wel iets bedacht om met $image->hasAttributes() alles attributen uit te lezen, in een arrayte pompen, deze uit te lezen, en dit opnieuw toe te voegen aan de img-tag, maar dat lijkt mij een overdreven karwei. Wat ik wil moet toch sneller kunnen?

Edit:
Ik denk dat het zinvoller is om te leven met deze doctype, en deze maar te strippen na de loadHTML.
Ik heb dit draadje op SO gevonden. Ik ga er mee verder frotten: https://stackoverflow.com/questions/4879946/how-to-savehtml-of-domdocument-without-html-wrapper

Hoewel duidelijk is dat het toevoegen van LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD aan de loadHTML echt het meest debielste doet met het random toevoegen van extra <p>s smiley. We gaan lekker verder zoeken!

Deel dit bericht


Link naar bericht
Delen op andere sites
Het is getackeld, en na wat testscripts lijkt het goed te werken:
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
public function parse($string) {
    global $settings;
    if($this->settings[camo_enabled] == true) {
        $doc = new DOMDocument();
         $doc->loadHTML($string,LIBXML_HTML_NODEFDTD);
         $images = $doc->getElementsByTagName(img);
    
         foreach ($images as $image) {
         $url = $image->getAttribute(src);
         if((substr($url, 0, 8) != https://) && !in_array($this->getHostname($url),$settings[camo_disallowed_domains])) {
             $image->setAttribute(data-original-source, $url);
             $camo = $this->proxy_url($url);
             $image->setAttribute(src, $camo);
            //$string = str_replace($image->getAttribute(src), $camo, $string);// therefore: $doc->saveHTML()
             unset($url, $camo);
         }
         }

    $trim_off_front = strpos($doc->saveHTML(),<body>) + 6;
    $trim_off_end = (strrpos($doc->saveHTML(),</body>)) - strlen($doc->saveHTML());
    $string = substr($doc->saveHTML(), $trim_off_front, $trim_off_end);
    return $string;
    }
    }

?>

Ranzig? Ja!
Maar ik kon niks beters vinden dan dit. Veel andere oplossingen hadden weer zijn nadelen.

Deel dit bericht


Link naar bericht
Delen op andere sites
Aarclay (link):
Het is getackeld, en na wat testscripts lijkt het goed te werken:
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
public function parse($string) {
    global $settings;
    if($this->settings[camo_enabled] == true) {
        $doc = new DOMDocument();
         $doc->loadHTML($string,LIBXML_HTML_NODEFDTD);
         $images = $doc->getElementsByTagName(img);
    
         foreach ($images as $image) {
         $url = $image->getAttribute(src);
         if((substr($url, 0, 8) != https://) && !in_array($this->getHostname($url),$settings[camo_disallowed_domains])) {
             $image->setAttribute(data-original-source, $url);
             $camo = $this->proxy_url($url);
             $image->setAttribute(src, $camo);
            //$string = str_replace($image->getAttribute(src), $camo, $string);// therefore: $doc->saveHTML()
             unset($url, $camo);
         }
         }

    $trim_off_front = strpos($doc->saveHTML(),<body>) + 6;
    $trim_off_end = (strrpos($doc->saveHTML(),</body>)) - strlen($doc->saveHTML());
    $string = substr($doc->saveHTML(), $trim_off_front, $trim_off_end);
    return $string;
    }
    }

?>

Ranzig? Ja!
Maar ik kon niks beters vinden dan dit. Veel andere oplossingen hadden weer zijn nadelen.


Ik erger me een beetje aan de indention smiley
Klik om de spoiler te openen

Deel dit bericht


Link naar bericht
Delen op andere sites
Is het zo erg dan smiley ?
Gelukkig heb ik dit al lang in mijn code netjes geident smiley

(wat een vervoegd woord)

En lijn 14 is nu:
Codeblok:
1
2
3
<?php
         if((substr($url, 0, 7) == http://) && !in_array($this->getHostname($url),$settings[camo_disallowed_domains])) {
?>


Anders probeert de functie eventuele relatieve paden (van je https-site!) aan camo te voeren, wat geen succes is.

Deel dit bericht


Link naar bericht
Delen op andere sites

Maak een account aan of log in om te reageren

Je moet lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Maak een account aan in onze gemeenschap. Het is makkelijk!

Registreer een nieuw account

Aanmelden

Ben je al lid? Meld je hier aan.

Nu aanmelden
Log in om dit te volgen  

×