0

<img>これはファンキーな質問かもしれませんが、HTMLのチャンクを取得してタグをスキャンし、タグに幅と高さの値がない場合は、それを適用する方法を誰かが考えられるlist($width, $height, $type, $attr);でしょうか。

より詳細には、htmlのみを含む別のページを含むphpページがあります。ブラウザに出力する前に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>

問題は、最初のimgタグを変更するだけで、その後はコードを出力しないように見える一方で、途中で完全なhtml4ファイルを生成することです。

<!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>

今、私は、right withとheightを含めるように実装する方法を理解するのに少し助けが必要です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 に答える