【问题标题】:Preg replace image src using callbackPreg 使用回调替换图像 src
【发布时间】:2017-05-02 13:12:21
【问题描述】:

我有一篇带有 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" />

我想使用此 URL,进行一些更改并下次更新 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;

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

【问题讨论】:

  • 您好,我尝试这样做:

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


【解决方案1】:

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

$doc = new DOMDocument();
$doc->loadHTML('<html><body><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" /></body></html>');
$images = $doc->getElementsByTagName('img');
foreach ($images as $img) {
    $url = $img->getAttribute('src');
    // do whatever you need to with $url
    $url = str_replace('img.zszywka.com', 'example.com', $url);
    $img->setAttribute('src', $url);
}
echo $doc->saveHTML();

【讨论】:

    【解决方案2】:

    解析答案更好,但要回答您的 regex/preg_replace_callback 为什么失败的问题...

    1. preg_quote 转义所有特殊的正则表达式字符,所以不要在你的正则表达式上使用。如果您将变量或未知字符传递给您的正则表达式,您会使用它。

    2. *. 无效 * 是一个量词,这意味着允许 0 个或多个前一个字符/组。 .* 是你想要的,它表示任何字符的零个或多个,不包括换行符。

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

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

    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

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

    【讨论】:

    • 看看 miken32 的回答,这是一种更好的方法,这更像是“正则表达式/回调有什么问题”
    【解决方案3】:

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

    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);
    

    谢谢大家回复我!

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2015-05-04
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多