【问题标题】:Automatically adding width and height attributes to <img> tags with a PHP function使用 PHP 函数自动为 <img> 标签添加宽度和高度属性
【发布时间】:2011-03-10 14:35:39
【问题描述】:

我想要的是一个可以在用户输入上运行的函数,它可以智能地找到 widthheight 属性并将其添加到 HTML blob 中的任何 &lt;img&gt; 标记,以避免页面重排问题,同时图像加载。

我正在为一个 PHP 论坛编写发帖脚本,其中用户的输入被清理并且通常在将其写入数据库以供以后显示之前变得更好。作为我所做的让事情变得更好的一个例子,我有一个脚本,可以将alt 属性插入到图像中,如下所示:

Here are two images: &lt;img src="http://example.com/image.png"&gt; &lt;img src="http://example.com/image2.png"&gt;

在被发布脚本清理后,变成

Here are two images: &lt;img src="http://example.com/image.png" alt="Posted image"&gt; &lt;img src="http://example.com/image2.png" alt="Posted image"&gt;

(这使得它在 HTML 4 严格下验证,但可能不符合 alt 属性的精神——唉!)

因此,对于我的函数,我有一个模糊的想法,即服务器需要在它在 HTML 块中找到的每个外部图像上运行 getimagesize(),然后将函数生成的属性应用于每个 &lt;img&gt;标记它遇到。我假设这个函数之前已经写过,但我在谷歌或 php.net 文档上没有运气。我是否必须从头开始,或者是否有人知道我可以使用或适应的(相对)强大的功能来完成这项工作?

【问题讨论】:

  • 我相信您需要获取图像并将其写入文件,然后对其运行 getimagesize() 以获取其宽度和高度。完成后,您可以 unlink($pathToFile) 删除它
  • 更有效的做法是拥有一个不会随着图像加载而中断/重排的布局;或者也许使用客户端脚本来操作宽度和高度属性。

标签: php html html-sanitizing getimagesize


【解决方案1】:

getimagesize() 是对的。你可以简单地做这样的事情:

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

如果图像托管在远程位置,则您必须下载所有图像(该函数会处理它),因此您可能希望缓存结果以加快后续请求的速度。

编辑:刚刚看到您有一个包含各种&lt;img&gt; 元素的字符串。这应该可以解决问题:

<?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();
?>

【讨论】:

  • 实际上,无论图像存储在哪里,缓存结果都是一个好主意。
  • 非常感谢您完成 DOM 流程,因为这让我感到害怕。我现在将尝试使用此代码。
  • 我正在慢慢实现这一点,目前正在通过 if() 检查确保如果 PHP 无法检索图像,我不会以 width="" height="" 结束。我还注意到,如果我的 HTML 字符串只是 &lt;img ...&gt; &lt;img ...&gt; &lt;img ...&gt; ,则 $newHTML 中不会返回任何内容。我将通过在字符串的前面和结尾插入一个虚拟单词并在处理后将其删除来以我糟糕的方式解决这个问题。不过,这很棒。谢谢。
【解决方案2】:

问题是您需要服务器预先完成大量工作。我怀疑离线填充大小数据库(或维护大小缓存)会更有效。

完成此操作后,您可以使用可缓存的 javascript 将工作推送到浏览器,该 javascript 设置图像大小并在 html 末尾被内联调用(其优点是您不需要推送所有的 html 都通过你的 PHP 代码进行重写)。提示:遍历 document.images[]

HTH

C.

【讨论】:

  • 这是一个不错的选择。例如,如果有人绕过这个 javascript,这不会是世界末日,所以让 PHP 来做这件事并不重要。
【解决方案3】:

您可以使用 getimagesize(),但最好将此信息存储一次并重复使用,或者至少积极缓存(因为它不太可能经常更改),否则您的服务器将在更高的负载下爬行停止

【讨论】:

  • 缓存真的是一个问题吗,当 PHP 只需要下载远程图像并在用户将图像发布到站点时检查它的繁重工作时?不必在每次页面加载时都调用它,因为它将更改写入数据库的 HTML,该数据库在线程显示脚本中被检索并逐字插入。图片每天只能发布几次。
猜你喜欢
  • 2021-07-11
  • 2016-10-29
  • 2013-09-26
  • 2014-07-03
  • 2010-12-11
  • 1970-01-01
  • 2016-10-15
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多