2012-06-14 4 views
0

Я пытаюсь просканировать содержимое и заменить исходные теги изображения чем-то другим (в частности, dataURI при его поддержке) - на основе нескольких вопросов, которые я прочитал здесь, я пытаюсь использовать preg_replace() :preg_replace image src

// 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'] правильно выводит путь к папке изображений, которые я урожденная d, но есть также несколько проверок, которые я пробовал и которых пока не удалось достичь:

  1. Проверьте, является ли источник изображения относительным, и если это так, отделите домен (в настоящее время можно быть сделано с site_url(), который я бы предполагающей должны быть preg_replace())
  2. Если изображение даже не локальный сервер (опять-таки - я предполагаю, что с помощью site_url() чек), пропустить его

Я не так хорошо знаком с preg_replace(), если у кого есть предложения, я бы очень признателен. Благодаря!

Редактировать: Вместо этого следует использовать http://simplehtmldom.sourceforge.net/? Кажется, это довольно тяжелый молот, но если это более надежный способ, то я все для него - кто-нибудь использовал это раньше?

ответ

0

В целом, разбор HTML с регулярными выражениями - не очень хорошая идея, и вы должны обязательно изучить использование чего-то другого, например, надлежащего анализатора HTML. Вам не очень нужен простой хром, встроенный DOMDocument и 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 
); 

Ваш текущий код пытается использовать placeplace \1 в совершенно несвязанном контексте, поэтому вы получаете ошибку синтаксического анализа.