使用PHP函数自动将宽度和高度属性添加到标签
-
01-10-2019 - |
题
我想要的是可以在用户输入上运行的函数,该函数将智能找到并添加 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属性的精神 - 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将工作推向浏览器,该JavaScript设置图像大小并在HTML末端称为内联(它具有优势,您不需要推动所有HTML通过您的PHP代码进行重写)。提示:通过document.images []迭代。
Hth
C。
您可以使用getImagesize(),但是将此信息存储一次并重复使用,或者至少会积极地缓存(因为不太可能经常更改)是很明智的