替换HTML文档中所有<img>标签的src属性值

问题描述 投票:0回答:2

我有以下代码(php),它将匹配img-src并替换为新的url

$rep = array('/', '+', '(', ')');
$with = array('\/', '\+', '\(', '\)');

$match_pattern = '/<img[^<]*src\s*=\s*\"'.str_replace($rep, $with, $source_url).'\"[^>]*>/iUu';
$img_replace_str = '<img src="'.$new_url.'" />';
$post_content = preg_replace($match_pattern, $img_replace_str, $post_content);

对于具有

src
http://www.example.com/a.jpg
的图像,没有问题,但对于具有
src
且包含像
http://www.example.com/b.jpg?height=900
这样的查询字符串的图像,则不匹配。

我想匹配带有和不带有查询字符串的图像标签。

php image replace html-parsing src
2个回答
2
投票

您可以使用 PHP 的

preg_quote()
-function 代替
str_replace()
。它会自动转义所有正则表达式特殊字符(请参阅文档)。这应该可以解决问题,因为您的
str_replace()
解决方案没有转义
?
,这是正则表达式中的特殊字符:

$match_pattern = '/<img[^<]*src\s*=\s*\"'.preg_quote($source_url, '/').'\"[^>]*>/iUu';

0
投票

使用合法的 DOM 解析器轻松直观地替换包含任何方式属性的

src
标签的
<img>
属性值。 XPath 非常直接地只针对
src
标签的
<img>
属性。

代码:(演示

$html = <<<HTML
<div>
Here is an img tag with no qs <img src="http://www.example.com/a.jpg">,
 an img with no src <img title="to be determined">,
 and here is another with a qs <img src="http://www.example.com/b.jpg?height=900">.
Here is a <iframe src="http://www.example.com/c.jpg?foo=bar"></iframe> and
 a submit button <input type="image" src="http://www.example.com/d.jpg?boo=far&what=now" alt="Submit">
</div>
HTML;

$newUrl = 'https://www.example.com/new.jpg';

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query("//img/@src") as $src) {
    $src->value = $newUrl;
}

echo $dom->saveHTML();

输出(两次合格替换后):

<div>
Here is an img tag with no qs <img src="https://www.example.com/new.jpg">,
 an img with no src <img title="to be determined">,
 and here is another with a qs <img src="https://www.example.com/new.jpg">.
Here is a <iframe src="http://www.example.com/c.jpg?foo=bar"></iframe> and
 a submit button <input type="image" src="http://www.example.com/d.jpg?boo=far&amp;what=now" alt="Submit">
</div>
© www.soinside.com 2019 - 2024. All rights reserved.