Автоматически добавляя атрибуты ширины и высоты в теги с функцией PHP

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

Вопрос

То, что я хочу, это функция, которую я могу работать на входе пользователя, который будет разумно найти и добавить width а также height атрибуты любому <img> Тег в Blob of 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 код для переписывания). Подсказка: итерация через документ .Images [

Емкость

Слияние

Вы можете использовать Whitimagesize (), но было бы уменным хранить эту информацию один раз и повторно использовать ее, или, по меньшей мере, кэш агрессивно (поскольку вряд ли часто меняется), или ваш сервер будет ползет до остановки с более высокой нагрузкой

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top