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

Другие вопросы по тегам