0

ここで読んだいくつかの質問に基づいて、コンテンツをスキャンし、画像ソースタグを別のもの (サポートされている場合は特に dataURI) に置き換えようとしていpreg_replace()ます:

// Base64 Encodes an image
function wpdu_base64_encode_image($imagefile) {
    $imgtype = array('jpg', 'gif', 'png');
    $filename = file_exists($imagefile) ? htmlentities($imagefile) : die($imagefile.'Image file name does not exist');
    $filetype = pathinfo($filename, PATHINFO_EXTENSION);
    if (in_array($filetype, $imgtype)){
        $imgbinary = fread(fopen($filename, "r"), filesize($filename));
    } else {
        die ('Invalid image type, jpg, gif, and png is only allowed');
    }
    return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}

// Do the do
add_filter('the_content','wpdu_image_replace');
function wpdu_image_replace($content) {
    $upload_dir = wp_upload_dir();
    return preg_replace( '/<img.*src="(.*?)".*?>/', wpdu_base64_encode_image($upload_dir['path'].'/'.\1), $content );
}

私が直面している問題wpdu_base64_encode_image($upload_dir['path'].'/'.\1)は、基本的にpreg_replace結果を出力していることです-現在取得しています:

Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING

$upload_dir['path']必要な画像フォルダーへのパスを正しく出力していますが、私が試したものの、まだ達成できていないいくつかのチェックもあります。

  1. 画像ソースが相対的なものかどうかを確認し、そうであれば、ドメインを削除します (現在、site_url()必要があると想定しているドメインを使用して実行できますpreg_replace()か?)
  2. 画像がサーバーに対してローカルでさえない場合(繰り返しますが、site_url()チェックを使用していると仮定しています)、スキップしてください

preg_replace()誰かに提案があれば、私はよく知りません。本当に感謝しています。ありがとう!

編集:代わりにhttp://simplehtmldom.sourceforge.net/を使用する必要がありますか? かなり重いハンマーのように思えますが、それがより信頼できる方法であるなら、私はそれで十分です - 誰かが以前にそれを使用したことがありますか?

4

1 に答える 1

0

一般に、正規表現を使用して HTML を解析することはあまり良い考えではなく、適切な HTML パーサーなどを使用することを検討する必要があります。DOMDocument組み込みのsimplehtmldom はまったく必要なく、getElementsByTagNameうまく機能します。

現在の問題に到達するには、このタイプの変換 (各置換を一致の任意の関数preg_replace_callbackにする場合) を使用して行います。

$path = $upload_dir['path']; // for brevity

return preg_replace_callback(
    '/<img.*src="(.*?)".*?>/',
    function ($matches) use($path) { 
        return wpdu_base64_encode_image($path.'/'.$matches[1]);
    },
    $content
);

\1現在のコードは、まったく無関係なコンテキストでプレースホルダーを使用しようとしているため、解析エラーが発生します。

于 2013-04-12T22:40:59.963 に答える