Preg使用回调替换图像src

时间:2016-12-16 17:23:49

标签: php regex preg-replace preg-replace-callback

我有一篇包含HTML标签的文章。这是一篇长篇文章,有3/5张图片。现在我想更新每个图像src属性。示例:

图片html标记如下:

<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://img.zszywka.com/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" />

我想获取此网址,进行一些更改,然后更新src。然后转到下一个图像并再次执行(因此脚本必须更改所有图像src)

最终的img标签如下:

<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://EXMAPLE.COM/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" />

所以我需要操纵变化。我尝试使用preg_replace_callback,但我遇到了问题:

// change image src


$finalContent = preg_replace_callback('/' . preg_quote('src="(*.?)"') . '/', 
function() use ($variable_with_changes){ return $variable_with_changes; }, $variable_with_article_content);

echo $finalContent;

这不起作用,我不知道如何更新图像域并保留路径。

3 个答案:

答案 0 :(得分:3)

您应该以parsing HTML为HTML,而不是使用正则表达式。

application.yml

答案 1 :(得分:1)

解析答案更好,但要回答你为什么你的正则表达式/ preg_replace_callback失败的问题......

  1. preg_quote逃脱所有特殊的正则表达式字符,因此请勿使用正则表达式。如果您将变量或未知字符传递给正则表达式,则可以使用它。

  2. *.无效,*是量词,表示允许前一个字符/组中的0个或更多个。 .*是您想要的,它意味着排除新行的任何字符中的零个或多个。

  3. 您没有对找到的匹配项进行任何操作,您需要将它们传递给函数。 function($match)

  4. 您永远不会在您的函数中交换域名。您可以使用str_replace

  5. PHP示例:

    $variable_with_article_content = '<img class="aligncenter" style="display: block;margin-left:auto;margin-right:auto;" src="http://img.zszywka.com/0/0269/w_0980/moj-swiat/muza-2013-najnowsze-eska-hity-2013-.jpg" width="642" />';
    $finalContent = preg_replace_callback('/' . 'src="(.*?)"' . '/', 
    function($match) { return 'src="' . str_replace('img.zszywka.com', 'EXMAPLE.COM', $match[1]) . '"'; }, $variable_with_article_content);
    
    echo $finalContent;
    

    演示:https://eval.in/699201

    另请注意,您的正则表达式并不要求您替换图片的域名。

答案 2 :(得分:-1)

我找到了解决方案,效果很好。 :)

function getURL($matches) {
  global $rootURL;
  return $matches[1] . $rootURL . "?type=image&URL=" . base64_encode($matches['2']);
}

$contents = preg_replace_callback("/(<img[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $contents);

感谢所有人回复我!