Автоматическое добавление атрибутов ширины и высоты в теги <img> с помощью функции PHP
То, что я хочу, это функция, которую я могу запустить при вводе данных пользователем, которая будет разумно находить и добавлять 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 - увы!)
Итак, для моей функции у меня есть смутное представление о том, что сервер должен будет работать getimagesize()
на каждом внешнем изображении, которое он находит в блоке HTML, затем примените атрибуты, которые функция генерирует к каждому <img>
тег, с которым он сталкивается. Я предполагаю, что эта функция была написана ранее, но мне не повезло в Google или php.net документах. Нужно ли начинать с нуля, или кто-то знает о (относительно) надежной функции, которую я могу использовать или адаптировать для выполнения этой работы?
3 ответа
Ты прав насчет 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[]
НТН
C.
Вы можете использовать getimagesize(), но было бы разумно сохранить эту информацию один раз и повторно использовать ее, или, по крайней мере, агрессивно кэшировать (поскольку это вряд ли изменится часто), иначе ваш сервер остановится с более высокой нагрузкой