0

HTML ドキュメント内のすべての画像をインライン画像 (data:image) に置き換えようとしています。動作しないサンプル コードがあります。

function data_uri($filename) {
$mime = mime_content_type($filename);
$data = base64_encode(file_get_contents($filename));
return "data:$mime;base64,$data";
}

function img_handler($matches) { 
$image_element = $matches[1];    
$pattern = '/(src=["\'])([^"\']+)(["\'])/'; 
$image_element = preg_replace($pattern, create_function( 
$matches, 
$matches[1] . data_uri($matches[2]) . $matches[3]), 
$image_element);     
return $image_element;
}

$content = (many) different img tags
$search = '(<img\s+[^>]+>)';
$content = preg_replace_callback($search, 'img_handler', $content);

誰かがこのコードをチェックできますか? ありがとう!

更新: (...) 警告 file_get_contents() [function.file-get-contents]: ファイル名を空にすることはできません (...)

つまり、src url がハンドラーにないことを意味します :(

更新 2

<?php
function data_uri($filename) {
    $mime = mime_content_type($filename);
    $data = base64_encode(file_get_contents($filename));

    return "data:$mime;base64,$data";
}

function img_handler($matches) { 
$image_element = $matches[0];
$pattern = '/(src=["\'])([^"\']+)(["\'])/'; 
$image_element = preg_replace_callback($pattern, create_function( 
$matchess,
$matchess[1] . data_uri($matchess[2]) . $matchess[3]), 
$image_element); 
return $image_element;
}

$content = '<a href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Googlelogoi.png/180px-Googlelogoi.png"><img class="alignnone" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Googlelogoi.png/180px-Googlelogoi.png" alt="google" width="580" height="326" title="google" /></a>';
$search = '(<img\s+[^>]+>)';
$content = preg_replace_callback($search, 'img_handler', $content);

echo $content;
?>

このテスト ファイルをアップロードしました -> http://goo.gl/vWl9B

4

1 に答える 1

3

あなたの正規表現は大丈夫です。使い方がcreate_function()間違っています。そして、その後、インナーpreg_replace_callback()は機能しません。への呼び出しはdata_uri()、正規表現置換が行われる前に発生するため、未定義のファイル名エラーが発生します。

適切なコールバック関数を使用してください:

$image_element = preg_replace_callback($pattern, "data_uri_callback", $image_element);

次に、コードをそこに移動します。

function data_uri_callback($matchess) {
    return  $matchess[1] . data_uri($matchess[2]) . $matchess[3];
}
于 2012-10-23T18:40:34.270 に答える