Question

Ce que je veux est une fonction que je peux courir sur l'entrée d'utilisateur qui intelligemment trouver et ajouter les width et les attributs height à une balise <img> dans un blob de HTML de façon à éviter les problèmes de pages-refusion en charge des images.

Je suis en train d'écrire le script d'affichage pour un forum PHP, où l'entrée d'un utilisateur est aseptisé et fait généralement plus agréable avant d'écrire à la base de données pour l'affichage plus tard. À titre d'exemple de ce que je fais pour rendre les choses plus agréable, j'ai un script qui insère alt attributs dans des images comme ceci:

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

qui, à désinfectante par le script d'affichage, devient

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

(Cela en fait valider en HTML 4 stricte, mais il est peut-être pas dans l'esprit des attributs alt-hélas!)

Alors, pour ma fonction, j'ai une vague idée que le serveur devra exécuter getimagesize() sur chaque image externe, il trouve dans le bloc de HTML, puis appliquer les attributs de cette fonction génère à chaque balise <img> elle se heurte . Je suppose que cette fonction a été écrit, mais je n'ai pas eu de chance sur Google docs ou PHP.net. Dois-je commencer à partir de zéro, ou est quelqu'un au courant d'un (relativement) fonction robuste que je peux utiliser ou adapter pour faire ce travail?

Était-ce utile?

La solution

Vous avez raison getimagesize(). Vous pouvez tout simplement faire quelque chose comme ceci:

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

Si l'image est hébergée sur un site distant, vous devrez télécharger toutes les images que (la fonction prend soin), de sorte que vous pouvez mettre en cache le résultat à accélérer les choses sur les requêtes suivantes.

Modifier Je viens de voir que vous avez une chaîne contenant divers éléments de <img>. Cela devrait faire l'affaire:

<?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();
?>

Autres conseils

Le problème est que vous exigez le serveur à faire beaucoup de travail à l'avant. Je pense que ce serait beaucoup plus efficace pour remplir une base de données de tailles hors ligne (ou maintenir un cache de tailles).

Et après avoir fait cela, vous pourriez pousser le travail vers le navigateur en utilisant un javascript cacheable qui définit la taille d'image et est appelé en ligne à la fin du html (qui a l'avantage de la vous n'avez pas besoin de pousser tout le html à travers vous de code PHP pour la réécriture). Astuce: itérer par document.images []

HTH

C.

vous pouvez utiliser getimagesize () mais il serait intelligent de stocker ces informations une fois et le réutiliser, ou au moins cache agressive (comme il est peu susceptible de changer souvent) ou votre serveur ramper à un arrêt avec une charge plus élevée

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top