我有一些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"/>
我知道这有一些正则表达式的魔力,只是不确定它应该是什么样子(或者这实际上是最好的方式)。
答案 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的人来说。