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

Вы правы в getimagesize() . Вы можете просто сделать что-то вроде этого:

 $img = 'image2.png'; $info = getimagesize($img); printf('<img src="%s" %s>', $img, $info[3]); 

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

Edit: Просто увидел, что у вас есть строка, содержащая различные элементы <img> . Это должно сделать трюк:

 <?php $html = <<<EOF something <img src="http://img.ruphp.com/php/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 (), но было бы разумно хранить эту информацию один раз и повторно использовать ее или, по крайней мере, кэшировать агрессивно (так как это вряд ли будет часто изменяться), или ваш сервер будет сканироваться с большей нагрузкой