إضافة سمات العرض والارتفاع تلقائيًا إلى علامات مع وظيفة PHP

StackOverflow https://stackoverflow.com/questions/3157516

سؤال

ما أريده هو وظيفة يمكنني تشغيلها على مدخلات المستخدم التي ستجدها بذكاء وإضافة width و height سمات إلى أي <img> وضع علامة في نقطة من HTML لتجنب مشكلات تدفق الصفحة أثناء تحميل الصور.

أنا أكتب البرنامج النصي النشر لمنتدى PHP ، حيث يتم تطهير إدخال المستخدم وجعله أجمل بشكل عام قبل كتابته إلى قاعدة البيانات للعرض لاحقًا. كمثال على ما أقوم به لجعل الأمور أجمل ، لدي نص يدرج alt سمات إلى صور مثل ذلك:

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

الذي ، عند التعقيم بواسطة البرنامج النصي ، يصبح

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

(هذا يجعله التحقق من صحة بموجب HTML 4 صارمة ، ولكن ربما ليس بروح السمة alt - alas!)

لذلك ، بالنسبة لوظيفتي ، لدي فكرة غامضة بأن الخادم سيحتاج إلى تشغيله getimagesize() في كل صورة خارجية ، تجدها في كتلة HTML ، ثم قم بتطبيق السمات التي تنشئها الوظيفة لكل منها <img> وضع علامة على. أفترض أن هذه الوظيفة قد كتبت من قبل ، لكن لم يكن لدي حظ على مستندات Google أو PHP.NET. هل يجب أن أبدأ من الصفر ، أم أن شخصًا ما على دراية بوظيفة قوية (نسبيًا) يمكنني استخدامها أو التكيف معها للقيام بهذه المهمة؟

هل كانت مفيدة؟

المحلول

أنت محق في getimagesize(). يمكنك ببساطة فعل شيء مثل هذا:

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

إذا تم استضافة الصورة في موقع بعيد ، فسوف يتعين عليك تنزيل جميع الصور على الرغم من العناية بها) ، لذلك قد ترغب في تخزين النتيجة لتسريع الأمور على الطلبات اللاحقة.

يحرر: رأيت فقط أن لديك سلسلة تحتوي على مختلف <img> عناصر. هذا ينبغي أن تفعل خدعة:

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

نصائح أخرى

المشكلة هي أنك تطلب من الخادم القيام بالكثير من العمل في المقدمة. أظن أنه سيكون أكثر كفاءة في ملء قاعدة بيانات للأحجام غير متصلة بالإنترنت (أو الحفاظ على ذاكرة التخزين المؤقت للأحجام).

وبعد القيام بذلك ، يمكنك دفع العمل إلى المتصفح باستخدام JavaScript القابل للتخزين المؤقت الذي يضع أحجام الصور ويتم استدعاؤه في نهاية HTML (والذي يتمتع بميزة لا تحتاج إلى دفع جميع HTML من خلال رمز PHP لإعادة الكتابة). تلميح: تكرار من خلال document.images [

HTH

جيم

يمكنك استخدام getImagesize () ولكن سيكون من الذكاء تخزين هذه المعلومات مرة واحدة وإعادة استخدامها ، أو على الأقل ذاكرة التخزين المؤقت بقوة (لأنه من غير المحتمل أن يتغير في كثير من الأحيان) أو أن الخادم الخاص بك سوف يزحف إلى حمل أعلى

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top