2013-03-19 2 views
0

Это может быть интересный вопрос, но мне интересно, может ли кто-нибудь подумать о том, как взять кусок html, сканировать его для тегов <img> и если тег не имеет ширины + значение высоты применяют его с list($width, $height, $type, $attr);?сканирование и редактирование высоты ширины img по php до выхода

Подробнее у меня есть страница 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

так что-то вроде этого? ' loadHTMLFile ("filename.html"); /* изменить img теги здесь как-то ... */ echo $ doc-> saveHTML(); ?> ' – Paul

+0

@Paul, точно. – Brad

+0

это/* изменение img теги здесь как-то ... */часть Я не уверен, как заставить придерживаться нового кода :) – Paul

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

Смежные вопросы