2013-03-19 24 views
0

這可能是一個時髦的問題,但我想知道是否有人可以想出一種方式如何把一大塊html,掃描它的<img>標籤,如果標籤沒有寬度+身高值適用於list($width, $height, $type, $attr);通過PHP掃描並編輯img寬度高度輸出前

更詳細地說,我有一個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

是的,這是完全可能的。

  1. Use a DOM parser to load your HTML找到您的圖片標籤。
  2. Use cURL to download images(如果你還沒有他們在本地)
  3. Use GD to get the image sizes
  4. 使用DOMDocument to modify the HTML
  5. Output modified HTML

請注意,所有這些都需要很長的處理時間。這可能不值得。至少,緩存結果。

+0

所以這樣的事情? '<?php $ doc = new DOMDocument(); $ doc-> loadHTMLFile(「filename.html」); /*在這裏改變img標籤莫名其妙...... */ echo $ doc-> saveHTML(); ?>' – Paul 2013-03-19 19:34:20

+0

@Paul,確實如此。 – Brad 2013-03-19 19:46:23

+0

這是/ *更改img標籤在這裏莫名其妙...... * /部分我不確定如何去堅持新的代碼:) – Paul 2013-03-19 19:58:15

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 
) 


.......... 
+0

你有一個例子,我怎樣才能得到它與編輯img標籤擬合模型在我最初(修改)後的輸出? – Paul 2013-03-19 19:50:53