preg_replace image src

时间:2012-06-14 18:35:37

标签: php preg-replace data-uri

我正在尝试浏览我的内容并将图像源代码替换为其他内容(更值得注意的是,支持时的dataURI) - 基于我在这里阅读的几个问题,我正在尝试{{1} }:

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 正在正确输出我需要的图像文件夹的路径,但是还有一些我已经尝试过但尚无法实现的检查:

  1. 检查图像源是否是相对的,如果是,则剥离域(目前可以使用$upload_dir['path']来完成,我假设需要site_url()?)
  2. 如果图像甚至不是服务器的本地图像(再次 - 我假设使用preg_replace()检查),请跳过它
  3. 如果有人有建议,我对site_url()并不熟悉,我真的很感激。谢谢!

    修改:我应该使用http://simplehtmldom.sourceforge.net/吗?看起来像一把相当沉重的锤子,但如果那是一种更可靠的方式,那么我就是为了它 - 所有人之前都使用过它?

1 个答案:

答案 0 :(得分:0)

一般来说,使用正则表达式解析HTML并不是一个好主意,你一定要考虑使用其他东西,比如正确的HTML解析器。你不太需要simplehtmldom,内置的DOMDocumentgetElementsByTagName可以很好地完成工作。

要解决当前的问题,这种类型的转换(您希望每次替换都是匹配的任意函数)是使用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,这就是您获得解析错误的原因。