我想要的是可以在用户输入上运行的函数,该函数将智能找到并添加 widthheight 属性 <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(),但是将此信息存储一次并重复使用,或者至少会积极地缓存(因为不太可能经常更改)是很明智的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top