Динамически заменить атрибуты «src» всех тегов <img>

У меня есть HTML и вы хотите заменить атрибуты «src» всех тегов img, чтобы они указывали на копии идентичных изображений (хотя и с разными именами файлов) на другом хосте.

Так, например, учитывая эти три тега

<IMG SRC="../graphics/pumpkin.gif" ALT="pumpkin"> <IMG BORDER="5" SRC="redball.gif" ALT="*"> <img alt="cool image" src="http://img.ruphp.com/php/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"/> 

Я знаю, что в этом есть какая-то регулярная магия, просто не уверен, как она должна выглядеть (или если это на самом деле лучший способ).

Я попытался сделать это с 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://img.ruphp.com/php/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: Если вам нужно уточнить свой вопрос, вы должны отредактировать исходный вопрос, а не открывать новый идентичный вопрос .

Если вас спросят о SO, вы, скорее всего, получите много ответов, в которых вместо этого вы должны использовать парсер. Думаю, это правильный ответ. В PHP вы можете использовать метод loadHTML DOMDocument для создания дерева DOM из данного HTML-документа, который вы можете пройти, изменяя теги по мере продвижения .

используя jquery, вы можете получить все изображения как таковые:

$ ( "IMG"). Каждая (функция (
if ($ this.attr ('src') == "../ graphics / pumpkin.gif") {
$ this.attr ('src', 'http://myhost.com/cache/img001.gif&apos;);
} else if …
))

Просто запустите все изображения в документе и получите / установите атрибут src.

  var images = document.getElementByTagName ('img');
 for (var i = 0; i <images.length; i ++)
 {
    images [i] .getAttribute ("src"); // что-то с этим делать
    images [i] .setAttribute ("src", some_new_value); // установить новый src
 } 

Как уже было сказано, для этого вам не нужен RegExp.

Вы можете использовать phpQuery для этого.

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

Вполне возможно, избыток, но он работает. Особенно для людей, привыкших работать с jQuery.

Вам понадобится нечувствительное к регистру соответствие регистров, и вам также нужно будет рассмотреть цитаты «vs».

HHMM. Я думаю, что я бы использовал System.Text.RegularExpressions.RegEx.Replace с вызовом делегата.

Вам нужно убедиться, что котировка соответствует, поэтому вам нужна проверка ORed. Грубо говоря:

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