Автоматическое добавление атрибутов ширины и высоты к тегам <img>с помощью функции PHP - PullRequest
3 голосов
/ 01 июля 2010

Мне нужна функция, которую я могу запустить при вводе пользователем, которая будет интеллектуально находить и добавлять атрибуты 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 ]

5 голосов
/ 01 июля 2010

Ты прав насчет 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();
?>
0 голосов
/ 01 июля 2010

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

0 голосов
/ 01 июля 2010

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

И сделав это, вы могли бы перенести работу в браузер, используя кешируемый JavaScriptкоторый устанавливает размеры изображения и называется встроенным в конце HTML (что имеет преимущество в том, что вам не нужно проталкивать весь HTML через ваш PHP-код для переписывания).Подсказка: переберите document.images []

HTH

C.

...