Автоматически добавляя атрибуты ширины и высоты в теги с функцией PHP
-
01-10-2019 - |
Вопрос
То, что я хочу, это функция, которую я могу работать на входе пользователя, который будет разумно найти и добавить 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 (), но было бы уменным хранить эту информацию один раз и повторно использовать ее, или, по меньшей мере, кэш агрессивно (поскольку вряд ли часто меняется), или ваш сервер будет ползет до остановки с более высокой нагрузкой