0

HTMLソースコードをSQLデータベースに保存する必要があります(Androidアプリの場合)。コンテンツはローカルに保存する必要があります。したがって、画像も保存する必要があります。次のように進めるのが適切だと思います。

  • サーバー上(php):すべてのimgsrcをimgsrc = "data:image ..."文字列に置き換えます(正規表現と画像の読み込み?)
  • 次に、HTMLコードをローカルのアプリケーションに保存できます

しかし、どうすればこれを実現できますか?または、画像をhtml5で保存する必要がありますか?あなたが私を助けてくれることを願っています!

アップデート:

$search = '(<img.*?src=")([^"]*?(\/[^/]*\.[^"]+))';
$replace = "<img src=\"".data_uri('$2')."\">";
$content = preg_replace($search, $replace, $content);

誰かがこのコードを修正できますか?ありがとう!

2回目の更新:

例:

<img class="alignnone" src="https://lh4.googleuserco (...)
<img src="https://lh4.googleuserco (...)
<img width="400" height="100" src='...' (...)
4

1 に答える 1

8

<img src="image.png" alt="An image">yourをに置き換え、<img src="<?php echo data_uri('image.png'); ?>" alt="An image">必要に応じて次の関数を定義します。

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

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

おそらく巨大なhtmlファイルになってしまうので、データベースの外にファイルを保存する方が良いでしょうか? Android には詳しくありませんが、iOS では、html ファイルを表示する webview のベース パスを次のように設定できます

更新

いくつかの img 要素を含む (content.php) を作成し、その上で以下を実行しました。

$content = file_get_contents('content.php');
$search = '/(<img\s+src=["\'])([^"\']+)(["\']\s+[^>]+>)/';
$content = preg_replace_callback($search, create_function(
        '$matches',
        'return $matches[1] . data_uri($matches[2]) . $matches[3];'
    ), $content);

質問に投稿したコードでは、パターンにスラッシュがありませんでした。また、文字通り実行するだけになってしまいますdata_uri('$2')(つまり、$2 はパラメーターとして使用される実際の文字列です)。preg_replace_callbackpreg_replace によって検出された実際の値にアクセスできます。

とにかく、上記のコードはすべての画像を によって返された値に置き換えdata_uri、したがって img 要素をデータ URI で構築します。現在、属性は二重引用符で囲まれており、それ以外は何もないと想定しているため、パターンを少し改善したい場合があります。また、src 属性は要素の最初の属性であると想定しているため、XML 解析が一般的に推奨される理由です。これの重大度は、コース外のデータを入力するかどうかによって異なります。

更新 2 :

より一般的な解決策は、私の最新のコメントに従って、2 つの正規表現に分割することです。まず、検索パターンを $search = '(]+>)'; に変更します。次に、関数を次のようpreg_replace_callback($search, 'img_handler', $content);に定義します。img_handler

function img_handler($matches) { 
    $image_element = $matches[1]; 

    $pattern = '/(src=["\'])([^"\']+)(["\'])/'; 
    $image_element; = preg_replace_callback($pattern, create_function( 
            $matches, 
            $matches[1] . data_uri($matches[2]) . $matches[3]), 
        $image_element); 

    return $image_element; 
}

これが機能する方法は、最初の正規表現がすべての ing 要素 () を識別し、それらをコールバック関数 img_handler に送信することです。これにより、src 属性のみが置き換えられます。XML はもう少し複雑です (ただし、より一般的です)。例をまとめる時間はありませんが、十分に文書化されています。基本的に同じことを行うDOMDocumentまたはSimpleXMLをチェックしてください。

最後に

あなたは今あなたの質問を2回修正しました.これは時々明確にするために確かに必要ですか.私たちは最初の質問からどんどん離れていると感じています. 質問を簡潔にし、1 つの主題に焦点を当てることをお勧めします。回答またはコメントが、それ自体では回答されていないさらなる質問を提起する場合は、おそらくその件に関する新しいスレッドを開始する (たとえば、 img 要素の src 属性を置き換える) か、同様の既に尋ねられた質問を探すことをお勧めします。

于 2012-10-23T10:37:30.483 に答える