2010-09-27 3 views
2

J'ai du code HTML et je souhaite remplacer les attributs "src" de toutes les balises img afin qu'elles pointent vers des copies d'images identiques (bien qu'avec des noms de fichier différents) sur un autre hôte.Remplacer dynamiquement les attributs "src" de toutes les balises <img>

Ainsi, par exemple, étant donné ces trois balises

<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"/> 

Je voudrais qu'ils remplacés par

<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"/> 

Je sais qu'il ya quelque chose de magique regexp à cela, tout simplement pas sûr de ce qu'il devrait ressembler (ou si c'est en fait le meilleur moyen)

+5

Vous devriez utiliser un analyseur XML, pas regex pour cela :) –

+3

[Les amis ne laissez pas les amis parser HTML avec des expressions régulières.] (Http://stackoverflow.com/questions/1732348/regex-match-open- tags-except-xhtml-self-contained-tags) (Je ne peux pas croire combien de fois par jour je dois coller ce lien.) – Ether

Répondre

5

J'ai essayé de faire cela avec SimpleHTMLDOM, et il semble fonctionner:

$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: Si vous avez besoin de clarifier votre question, vous devez modifier votre question initiale au lieu d'ouvrir une nouvelle identical question.

+0

Bill, ça marche parfaitement. Merci beaucoup. Et oui, vous avez raison. En fait, je voulais simplement fermer cette question et en commencer une nouvelle sans utiliser la combinaison de mots très dangereuse de "HTML" et "regex", mais j'ai ensuite trouvé que je ne pouvais pas fermer celui-ci. Tant pis. Merci encore. – njt

4

Cela étant demandé sur SO, vous obtiendrez probablement beaucoup de réponses vous disant d'utiliser un analyseur à la place. Devinez quoi, je pense que c'est la bonne réponse. En PHP, vous pouvez utiliser la méthode loadHTML de DOMDocument pour créer une arborescence DOM à partir d'un document HTML donné, que vous pouvez parcourir en modifiant les balises au fur et à mesure.

+0

il est * loin * plus susceptible d'obtenir une référence à la maintenant-obligatoire [il vient ] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+0

@David Nah, ce n'est pas l'analyse HTML, c'est juste analyse de texte en clair. –

+0

@Roger, il y a, peut-être, cette grâce qui sauve. –

0

Vous aurez besoin correspondant insensible à la casse RegEx, et vous aurez également besoin de considérer "vs" guillemets.

hhmm. Je pense que j'utiliser un System.Text.RegularExpressions.RegEx.Replace avec appel délégué .

vous auriez besoin pour vous assurer que le devis adapté, de sorte que vous auriez besoin d'un chèque ORed En gros:.

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

en utilisant jquery, vous pouvez obtenir toutes les images en tant que telles:

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

0

Exécutez simplement toutes les images du document et obtenez/définissez l'attribut 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 
}

Comme beaucoup l'ont déjà dit, vous n'avez pas besoin de RegExp pour cela.

0

Pour ce faire, vous pouvez utiliser phpQuery.

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

Tout à fait peut-être trop, mais cela fonctionne. Surtout pour les personnes habituées à travailler avec jQuery.

Questions connexes