Problème avec une regexp (php)

Résolu
Kopros Messages postés 595 Date d'inscription   Statut Membre Dernière intervention   -  
Mihawk Messages postés 4315 Date d'inscription   Statut Contributeur Dernière intervention   -
Salut à tous,

J'ai jamais été très fort en expressions régulières, et là j'en ai une qui me prend un peu la tête.
J'ai une chaîne de caractères qui contient des balises HTML img.
Le but est de supprimer de cette chaîne toutes les img dont la source (src) est passée en paramètre.
J'ai fait ça :

$content=preg_replace('/(<img src=".*?'.$src.'.*?\/>)/i', '', $result[$f]);


où :
- $result[$f] est la chaîne de caractères qui contient au moins 1 balise img
- $src est la source de l'image
- $content est le résultat


Alors y'a un truc que j'ai pas compris, c'est qu'avant ça me supprimait toutes mes images (mêmes celles que je voulais pas supprimer), et maintenant c'est toute la chaîne qui est remplacée par rien...

Est-ce que quelqu'un peut m'aider ???

Merci d'avance


A voir également:

4 réponses

Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
essayes:

$content=preg_replace('/(<img src="'.$src.'" \/>)/i', '', $result[$f]);
0
Kopros Messages postés 595 Date d'inscription   Statut Membre Dernière intervention   89
 
Merci de ta réponse.
Le problème c'est qu'il peut y avoir d'autres attributs, comme un "alt" ou un "title".
Et $src est un chemin relatif, c'est possible que dans la chaîne il y ait des "../" devant.

Je vais tout de même essayer ta regexp, mais elle me semble pas assez souple.
0
Mihawk Messages postés 4315 Date d'inscription   Statut Contributeur Dernière intervention   846
 
Hello,

Il ne faut jamais, jamais, utiliser le '.*' dans une expression régulière, sauf en début ou en fin.

En effet, si tu cherche "#debut.*fin#" alors comment savoir si le terme "fin" est celui que tu cherches, ou bien celui compris dans le .* ?
Si jamais, après le .*, ta chaîne contient plusieurs fois le terme de fin de ta regexp (à savoir /> dans ton cas) alors seul le dernier sera conservé.

Dans ton cas ça se traduit par une suppression de toutes les images. Tu me suis ?

La solution > connaître le format de source de tes images, ou bien le remplacer par quelques chose de plus précis ne contenant pas de .* :)
0
A.Nonymous
 
Que peut valoir $src ? "http://monsite.com/image.png" ?

En injectant cette valeur dans '/(<img src=".*?'.$src.'.*?\/>)/i', ça risque de ne pas marcher comme prévu :/

'/(<img src=".*?http://monsite.com/image.png.*?\/>)/i'

Il serait déjà pas mal d'utiliser un autre caractère que "/" pour délimiter l'expression régulière (genre "¤" ou autre caractère un minimum exotique).

Il est vrai que le ".*" est pas top dans ce cas. Puisqu'il s'agit de HTML, il serait mieux de capturer ce qui n'est pas ">", autrement dit "¤<img\s[^>]+src=\"".$src."\"[^>]+>¤". Mieux mais pas infaillible ... (alt=">" title=">" ...)
0
Utilisateur anonyme
 
je pense que ca devrait marcher :p "#<img*+?src=\"".$src."\"*+?>#"
0
Kopros Messages postés 595 Date d'inscription   Statut Membre Dernière intervention   89
 
Merci beaucoup pour votre aide ! :-)
Alors, avec la solution d'Ammmine, toute la chaîne était effacée à partir de "<img".Je pense que c'est pour la raison qu'a évoqué Mihawk, avec le * (mais bon, vu mes compétences en regexp ça vaut pas grand chose ce que je pense ^^).

Du coup je me suis penché sur celle d'Anonymous, j'ai modifié 2 ou 3 trucs, ce qui donne :
$content=  htmlspecialchars(preg_replace('#<img[^>]* src="[^"]*'.$src.'[^>]*/>#is', '', htmlspecialchars_decode($result[$f])));


Le htmlspecialchars c'est pas obligé pour la regexp, mais c'est parce que c'est encodé dans la base.
Et sinon ben ça marche nickel.

Encore merci pour vos réponses !
0
Mihawk Messages postés 4315 Date d'inscription   Statut Contributeur Dernière intervention   846
 
De rien, merci de ton retour :)
0