Frage

Was ich will, ist eine Funktion, die ich auf Benutzereingaben ausführen kann, die auf intelligente Weise finden und fügen Sie die width und height Attribute zu jedem <img> Tag in einem Klecks HTML um zu vermeiden, Seite-Reflowing Probleme während Bilder Belastung.

Ich schreibe über die Entsendung Skript für ein PHP-Forum, in dem eine Eingabe des Benutzers hygienisiert wird und in der Regel schöner gemacht, bevor sie in die Datenbank für die spätere Anzeige zu schreiben. Als Beispiel dafür, was ich tun, um die Dinge schöner zu machen, habe ich ein Skript, dass Einsätze alt Attribute in Bilder wie folgt:

Here are two images: <img src="http://example.com/image.png"> <img src="http://example.com/image2.png">

, die bei der Buchung Skript Hygienisierung, wird

Here are two images: <img src="http://example.com/image.png" alt="Posted image"> <img src="http://example.com/image2.png" alt="Posted image">

(Dies macht es unter HTML validieren 4 streng, aber vielleicht ist nicht im Sinne der alt-Attribut-leider!)

Also, für meine Funktion habe ich eine vage Vorstellung, dass der Server benötigt getimagesize() auf jedes externes Bild, um es auszuführen in dem Block von HTML findet, dann die Attribute gelten diese Funktion zu jedem erzeugt und jedem <img> Tag läuft es in . Ich gehe davon aus, dass diese Funktion zuvor geschrieben wurde, aber ich habe kein Glück bei Google oder php.net docs hatte. Muß ich von vorne anfangen, oder ist jemand Kenntnis von einer (relativ) robusten Funktion, dass ich verwenden oder anpassen kann, um diesen Job zu tun?

War es hilfreich?

Lösung

Sie haben Recht über getimagesize(). Sie können einfach so etwas tun:

$img = 'image2.png';
$info = getimagesize($img);
printf('<img src="%s" %s>', $img, $info[3]);

Wenn das Bild an einem entfernten Standort gehostet wird, finden Sie alle die Bilder herunterladen müssen aber (die Funktion kümmert es), so dass Sie das Ergebnis an die Dinge beschleunigen auf nachfolgende Anfragen zwischenzuspeichern interessiert sein könnte.

Edit: Just saw, dass Sie einen String mit verschiedenen <img> Elemente haben. Dies sollte den Trick tun:

<?php
$html = <<<EOF
something <img src="https://www.google.com/images/logos/ssl_logo_lg.gif"> hello <img src="https://mail.google.com/mail/images/2/5/logo1.png">
EOF;

$dom = new DOMDocument();
$dom->loadHTML($html);

foreach ($dom->getElementsByTagName('img') as $img) {
    list($width, $height) = getimagesize($img->getAttribute('src'));
    $img->setAttribute('width', $width);
    $img->setAttribute('height', $height);
}

$xpath = new DOMXpath($dom);
$newDom = new DOMDocument();
foreach ($xpath->query('//body/p')->item(0)->childNodes as $node) {
    $newDom->appendChild($newDom->importNode($node, true));
}

$newHtml = $newDom->saveHTML();
?>

Andere Tipps

Das Problem ist, dass Sie den Server erfordert eine Menge Arbeit nach vorne zu tun. Ich vermute, wäre es viel effizienter sein, offline eine Datenbank von Größen zu füllen (oder eine Cache-Größen zu halten).

Und dies getan zu haben, könnten Sie die Arbeit drücken, um den Browser, indem Sie einen Cache gespeichert werden mit Hilfe von Javascript, die die Bildgrößen setzen und Inline am Ende des HTML genannt (was den Vorteil hat, die Sie Push nicht brauchen alle html durch Sie PHP-Code zum Umschreiben). Hinweis: iterate durch document.images []

HTH

C.

Sie verwenden können getimagesize (), aber es wäre klug, diese Informationen einmal zu speichern und wiederverwenden, oder zumindest Cache aggressiv (wie es unwahrscheinlich ist, oft zu ändern) oder der Server mit höherer Last

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top