动态替换所有<img/>标记的“src”属性

时间:2010-09-27 22:07:40

标签: php regex

我有一些HTML,想要替换所有img标签的“src”属性,以便它们指向另一台主机上相同图像的副本(尽管文件名不同)。

例如,给出这三个标签

<IMG SRC="../graphics/pumpkin.gif" ALT="pumpkin">
<IMG BORDER="5" SRC="redball.gif" ALT="*"> 
<img alt="cool image" src="http://www.crunch.com/pic.jpg"/>

我希望将它们替换为

<IMG SRC="http://myhost.com/cache/img001.gif" ALT="pumpkin">
<IMG BORDER="5" SRC="http://myhost.com/cache/img002.gif" ALT="*"> 
<img alt="cool image" src="http://myhost.com/cache/img003.jpg"/>

我知道这有一些正则表达式的魔力,只是不确定它应该是什么样子(或者这实际上是最好的方式)。

6 个答案:

答案 0 :(得分:5)

我尝试使用SimpleHTMLDOM执行此操作,它似乎有效:

$html = str_get_html( ... ); // what you have done

$map = array(
  "../graphics/pumpkin.gif"       => "http://myhost.com/cache/img001.gif",
  "redball.gif"                   => "http://myhost.com/cache/img002.gif",
  "http://www.crunch.com/pic.jpg" => "http://myhost.com/cache/img003.gif",
);

foreach ($html->find("img") as $element) {
  if (isset($map[$element->src])) {
    $element->src = $map[$element->src];
  }
}

echo $html;

PS:如果您需要澄清问题,则应修改原始问题,而不是打开新问题identical question

答案 1 :(得分:4)

在SO上问这个问题,你很可能会得到很多答案,告诉你改为使用解析器。猜猜看,我认为这是正确的答案。在PHP中,您可以使用DOMDocument的loadHTML方法从给定的HTML文档创建DOM树,您可以在其中查看,随着时间的推移修改标记。

答案 2 :(得分:0)

您需要不区分大小写的RegEx匹配,并且还需要考虑“vs”引号。

HHMM。我想我会使用带有委托调用的System.Text.RegularExpressions.RegEx.Replace。

您需要确保报价匹配,因此您需要进行ORed检查。大致是:

\<IMG .* src\=\'.*?\' | \<IMG .* src\=\".*?\"

答案 3 :(得分:0)

使用jquery,您可以获得所有图像:

$("img").each(function(
  if($this.attr('src') == "../graphics/pumpkin.gif"){
    $this.attr('src', 'http://myhost.com/cache/img001.gif');
  }else if...
))

答案 4 :(得分:0)

只需遍历文档中的所有图像,然后获取/设置src属性。

var images=document.getElementByTagName('img');
for(var i=0;i<images.length;i++)
{
   images[i].getAttribute("src");//do something with it
   images[i].setAttribute("src",some_new_value);//set new src
}

正如许多人已经说过的那样,你不需要RegExp。

答案 5 :(得分:0)

您可以使用phpQuery执行此操作。

foreach (pq("img") as $img) {
  // insert regexp magic here
  $img->attr('src', $newurl);
}

很可能是矫枉过正,但它确实有效。特别是对于习惯使用jQuery的人来说。

相关问题