这可能是一个时髦的问题,但我想知道是否有人能想到一种方法,如何采取一大块html,扫描它的<img>
标签,如果标签没有宽度和高度值应用它与list($width, $height, $type, $attr);
?
这是我正在看的内容的简化版本:
<!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);
包括正确的和高度(显然只有当它还没有设置)。
是的,这是完全可能的。
- 使用DOM解析器加载HTML并查找图像标签。
- 使用cURL下载图片(如果你在本地没有)
- 使用GD获取图像大小 使用DOMDocument来修改HTML
- 输出修改后的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
)
..........