4

私が欲しいのは、画像の読み込み中にページがリフローする問題を回避するために、HTMLのblob内の任意のタグをインテリジェントに検索しwidthheight属性を追加するユーザー入力で実行できる関数です。<img>

私はPHPフォーラムの投稿スクリプトを書いています。このスクリプトでは、ユーザーの入力がサニタイズされ、後で表示するためにデータベースに書き込む前に、通常はより適切になります。物事をより良くするために私がしていることの例として、次のようaltに画像に属性を挿入するスクリプトがあります。

Here are two images: <img src="http://example.com/image.png"> <img src="http://example.com/image2.png">

これは、投稿スクリプトでサニタイズすると、次のようになります。

Here are two images: <img src="http://example.com/image.png" alt="Posted image"> <img src="http://example.com/image2.png" alt="Posted image">

(これにより、HTML 4での検証が厳密になりますが、alt属性の精神ではない可能性があります—alas!)

したがって、私の関数については、サーバーがgetimagesize()HTMLのブロックで検出した各外部画像で実行し、関数が生成する属性を実行するすべての<img>タグに適用する必要があるという漠然とした考えがあります。この関数は以前に作成されたものだと思いますが、Googleやphp.netのドキュメントには運がありませんでした。私は最初から始める必要がありますか、それとも誰かが私がこの仕事をするために使用または適応できる(比較的)堅牢な機能を知っていますか?

4

3 に答える 3

6

あなたは正しいですgetimagesize()。あなたは単にこのようなことをすることができます:

$img = 'image2.png';
$info = getimagesize($img);
printf('<img src="%s" %s>', $img, $info[3]);

画像がリモートの場所でホストされている場合は、すべての画像をダウンロードする必要があります(関数が処理します)。そのため、結果をキャッシュして、後続のリクエストで処理を高速化することをお勧めします。

編集:さまざまな<img>要素を含む文字列があることを確認しました。これでうまくいくはずです:

<?php
$html = <<<EOF
something <img src="https://www.google.com/images/logos/ssl_logo_lg.gif"> hello <img src="https://mail.google.com/mail/images/2/5/logo1.png">
EOF;

$dom = new DOMDocument();
$dom->loadHTML($html);

foreach ($dom->getElementsByTagName('img') as $img) {
    list($width, $height) = getimagesize($img->getAttribute('src'));
    $img->setAttribute('width', $width);
    $img->setAttribute('height', $height);
}

$xpath = new DOMXpath($dom);
$newDom = new DOMDocument();
foreach ($xpath->query('//body/p')->item(0)->childNodes as $node) {
    $newDom->appendChild($newDom->importNode($node, true));
}

$newHtml = $newDom->saveHTML();
?>
于 2010-07-01T12:11:08.020 に答える
0

問題は、サーバーが前もって非常に多くの作業を行うことを要求していることです。サイズのデータ​​ベースにオフラインでデータを入力する(またはサイズのキャッシュを維持する)方がはるかに効率的だと思います。

これを行った後、画像サイズを設定し、HTMLの最後でインラインと呼ばれるキャッシュ可能なJavaScriptを使用して、作業をブラウザーにプッシュできます(これには、すべてのHTMLをプッシュする必要がないという利点があります書き換え用のPHPコードを介して)。ヒント:document.images[]を繰り返し処理します

HTH

C。

于 2010-07-01T12:15:27.920 に答える
0

getimagesize()を使用することもできますが、この情報を一度保存​​して再利用するか、少なくとも積極的にキャッシュする(頻繁に変更される可能性は低いため)か、サーバーがクロールして負荷が高くなると停止するのが賢明です。

于 2010-07-01T12:16:59.687 に答える