0

我必须将 html 源代码保存在 sql 数据库中(对于 android 应用程序)。内容必须存储在本地。所以图像也必须保存。我认为进行以下操作是合适的:

  • 在服务器(php)上:将所有 img src 替换为 img src="data:image..." 字符串(正则表达式和加载图像?)
  • 然后我可以将html代码存储在我的应用程序中

但我怎么能意识到这一点?还是我应该用 html5 保存图像?我希望你能帮助我!

更新:

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

有人可以更正此代码吗?谢谢!

第二次更新:

例子:

<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"><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 的基本路径,如下所示

更新

我创建了一个 (content.php) 包含几个 img 元素,然后在其上运行以下内容:

$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_callback允许您访问 preg_replace 找到的实际值。

无论如何,上面的代码将用返回的替换所有图像data_uri,从而使用数据 URI 构建 img 元素。您可能想稍微改进一下模式,因为它目前假定属性用双引号括起来,没有别的,而且src 属性是元素的第一个属性,这就是我认为通常建议使用 XML 解析的原因。这种情况的严重程度取决于您输入的数据偏离路线。

更新 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 有点复杂(但更通用)。我没有时间整理一个例子,但它有很好的记录。查看DOMDocumentSimpleXML基本上做同样的事情。

结束时

您现在已经两次修改了您的问题,并且有时肯定需要澄清这一点,我觉得我们离最初的问题越来越远。我建议让您的问题保持简洁并专注于一个主题。如果答案或评论引发了进一步的问题,而这些问题本身没有得到回答,最好就该问题启动一个新线程(例如,替换 img 元素的 src 属性)或查找任何类似的已经提出的问题。

于 2012-10-23T10:37:30.483 回答