0

这可能是一个时髦的问题,但我想知道是否有人能想到一种方法如何获取一大块 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);包含正确的高度和高度(显然只有在它尚未设置时)。

4

2 回答 2

1

是的,这是完全可能的。

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

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

于 2013-03-19T19:26:39.833 回答
0

你可以试试

$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
)


 .......... 
于 2013-03-19T19:34:10.140 回答