在输出之前,通过PHP扫描和编辑img宽度和高度


scan and edit img width height through php before output

这可能是一个时髦的问题,但我想知道是否有人能想到一种方法,如何采取一大块html,扫描它的<img>标签,如果标签没有宽度和高度值应用它与list($width, $height, $type, $attr); ?

更详细地说,我有一个php页面,其中包含另一个只有html的页面。我希望在输出到浏览器之前更改html。

这是我正在看的内容的简化版本:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div id="content">
<?php 
include_once("client-contributed-text-and-images.php");
?>
</div>
</body>
</html>

经过下面的一些输入,我得到了以下内容:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div id="content">
<?php
$dom = new DOMDocument();
$dom->loadHTMLFile("client-contributed-text-and-images.php");
foreach ($dom->getElementsByTagName('img') as $item) {
    $item->setAttribute('width', '100');
    echo $dom->saveHTML();
    exit;
}
?>
</div>
</body>
</html>

问题是它在中间生成一个完整的html4文件,而只更改第一个img标记,并且似乎不输出之后的代码:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div id="content">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><img src="img1.jpg" width="100"><h1>header</h1>
<p>some text</p>
<a href="http://google.com">some link</a>
<img src="img2.jpg"></body></html>

所以我换了档,试着用fopen()代替,让它部分工作:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div id="content">
<?php
$root = realpath($_SERVER['DOCUMENT_ROOT']);
$file = $root."/client-contributed-text-and-images.php";
$f = fopen($file, 'r');
$contents = fread($f, filesize($file));
fclose($f);
$new_contents = str_replace("<img ", "<img width='100' height='100' ", $contents); 
echo $new_contents;
?>
</div>
</body>
</html>
给了

:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<div id="content">
<img width='100' height='100' src="img1.jpg">
<h1>header</h1>
<p>some text</p>
<a href="http://google.com">some link</a>
<img width='100' height='100' src="img2.jpg"></div>
</body>
</html>

现在我只需要一些帮助,弄清楚如何实现list($width, $height, $type, $attr);包括正确的和高度(显然只有当它还没有设置)。

是的,这是完全可能的。

  1. 使用DOM解析器加载HTML并查找图像标签。
  2. 使用cURL下载图片(如果你在本地没有)
  3. 使用GD获取图像大小
  4. 使用DOMDocument来修改HTML
  5. 输出修改后的HTML。

请注意,所有这些都将花费很长的处理时间。这可能不值得。至少,缓存结果。

你可以试试

$url = 'http://yahoo.com';
$dom = new DOMDocument();
@$dom->loadHTMLFile($url);
$imgs = $dom->getElementsByTagName("img");
foreach ( $imgs as $img ) {
    $attrs = array();
    // only load large images
    if ((int) $img->getAttribute("height") < 80)
        continue;
    for($i = 0; $i < $img->attributes->length; ++ $i) {
        $node = $img->attributes->item($i);
        $attrs[$node->nodeName] = $node->nodeValue;
    }
    print_r($attrs);
}

输出
Array
(
    [src] => http://l3.yimg.com/nn/fp/rsz/031913/images/smush/ucf-thwarted_635x250_1363714489.jpg
    [class] => fptoday-img
    [alt] => Quick thinking helped thwart UCF massacre plan (AP)
    [title] => Quick thinking helped thwart UCF massacre plan (AP)
    [width] => 635
    [height] => 250
)
Array
(
    [src] => http://l.yimg.com/os/mit/media/m/base/images/transparent-95031.png
    [style] => background-image:url('http://l2.yimg.com/ts/api/res/1.2/8hS1Q3v9rmaW8yI0eXEPHw--/YXBwaWQ9eWhvbWVydW47cT04NTtzbT0xO3c9MjUwO2g9MTU5/http://media.zenfs.com/en_us/News/Reuters/2013-03-19T120925Z_1_CBRE92I0XS100_RTROPTP_2_USA-SHOOTING-OHIO.JPG');
    [width] => 129
    [height] => 82
    [alt] => 
    [title] => 
    [class] => lzbg
)
Array
(
    [src] => http://l.yimg.com/os/mit/media/m/base/images/transparent-95031.png
    [style] => background-image:url('http://l3.yimg.com/ts/api/res/1.2/wcwLlp6sGVdOT7WXfkGEkQ--/YXBwaWQ9eWhvbWVydW47cT04NTtzbT0xO3c9MTg2O2g9MjUw/http://l.yimg.com/os/publish-images/lifestyles/2013-03-19/d9f10733-ee09-4e1f-a363-e3b9cd66078f_garygoldsmith.jpg');
    [width] => 82
    [height] => 110
    [alt] => 
    [title] => 
    [class] => lzbg
)

 ..........