正则表达式:将<img>标签的相对URL转换为绝对URL

3
我需要查看一个HTML字符串,并将所有 <img> 标签中的 src 属性是相对路径的改为绝对路径URL。所以这个:
<img src="puppies.jpg">

需要变成:

<img src="http://sitename.com/path/puppies.jpg">

忽略那些已经是绝对路径的 <img> 标签的 src 属性。我正在使用 PHP,并且假设我需要通过 preg_replace() 运行此操作。帮帮我!谢谢!

那是针对JavaScript的,但原理是相同的。 - Madara's Ghost
考虑使用DomDocument类来处理HTML,而不是使用preg。 - Ja͢ck
2个回答

8

这并不是正则表达式的工作,而应该交给XML/DOM解析器。

我建议尝试使用DOMDocument。

$DOM = new DOMDocument;
$DOM->loadHTML($html);

$imgs = $DOM->getElementsByTagName('img');
foreach($imgs as $img){
    $src = $img->getAttribute('src');
    if(strpos($src, 'http://sitename.com/path/') !== 0){
        $img->setAttribute('src', "http://sitename.com/path/$src");
    }
}

$html = $DOM->saveHTML();

1
我赞同了,但它还需要检查 src 属性是否已经是绝对路径,根据原帖。 - Evan Davis
@Mathletics:啊,是的,我没注意到,我可以加上那个 :-P - gen_Eric
@Jack:好主意,已更改 :-P - gen_Eric
太好了!完成了!问题:自动返回的HTML会带有<doctype>,<html>,<body>等标签。有没有办法关闭它?我只想要我最初提供的内容...只是用查找和替换部分完成。这样说清楚了吗? - Sam

0
这不是正则表达式的工作,而是需要使用XML/DOM解析器来完成。如果只是想给每个src属性添加一个前缀,最好使用简单的字符串函数,不要考虑XML、正则表达式或DOM解析。
$str = str_replace('<img src="', '<img src="http://prefix', $str);

您可以在之后清理错误的链接(已经是绝对链接)

$str = str_replace('<img src="http://prefixhttp://', '<img src="http://', $str);

如果可以避免的话,请不要用正则表达式/ DOM 弄炸你的代码。


如果我的HTML是<img class='animals' src='puppies.jpg' />,会发生什么? - gen_Eric
@Rocket 抱歉,但他说他的 HTML 是 <img src="puppies.jpg"> - sbstjn
错误的链接可以很容易地修复:str_replace('prefixprefix', 'prefix', $str)str_replace('http://prefix/http://', 'http://', $str)如果不必要,不要用正则表达式/ DOM 炸毁您的代码... - sbstjn
@semu,我完全同意你的看法。对于这个实例(和我的),没有理由添加各种不必要的开销,当一个简单的解决方案存在时...虽然不是最优雅的,但它绝对能完成工作。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接