Preg 使用回调替换图像 src
Preg replace image src using 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" />
我想接受这个 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;
这行不通,我不知道如何更新图像域并保留路径。
您应该 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();
解析答案更好,但要回答您的 regex/preg_replace_callback 为什么失败的问题...
preg_quote
转义所有特殊的正则表达式字符,因此不要在您的正则表达式上使用。如果您将变量或未知字符传递给您的正则表达式,您将使用它。
*.
无效 *
是量词,意思是前面的 character/group 可以有 0 个或多个。 .*
是你想要的,它意味着零个或多个不包括换行符的任何字符。
您没有对找到的匹配项执行任何操作,您需要将它们传递给函数。 function($match)
.
您永远不会在函数中交换域名。您可以为此使用 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;
另请注意,您的正则表达式不要求您替换图像的域。
我找到了解决方案,效果很好。 :)
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);
谢谢大家回复我!
我有一篇带有 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;
这行不通,我不知道如何更新图像域并保留路径。
您应该 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();
解析答案更好,但要回答您的 regex/preg_replace_callback 为什么失败的问题...
preg_quote
转义所有特殊的正则表达式字符,因此不要在您的正则表达式上使用。如果您将变量或未知字符传递给您的正则表达式,您将使用它。*.
无效*
是量词,意思是前面的 character/group 可以有 0 个或多个。.*
是你想要的,它意味着零个或多个不包括换行符的任何字符。您没有对找到的匹配项执行任何操作,您需要将它们传递给函数。
function($match)
.您永远不会在函数中交换域名。您可以为此使用
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;
另请注意,您的正则表达式不要求您替换图像的域。
我找到了解决方案,效果很好。 :)
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);
谢谢大家回复我!