Problème avec une regexp (php)

Résolu/Fermé
Kopros Messages postés 597 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 février 2020 - 19 juin 2012 à 18:39
Mihawk Messages postés 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 - 26 juin 2012 à 15:52
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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
19 juin 2012 à 19:23
essayes:

$content=preg_replace('/(<img src="'.$src.'" \/>)/i', '', $result[$f]);
0
Kopros Messages postés 597 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 février 2020 89
20 juin 2012 à 10:28
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 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
20 juin 2012 à 10:38
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
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
20 juin 2012 à 23:58
je pense que ca devrait marcher :p "#<img*+?src=\"".$src."\"*+?>#"
0
Kopros Messages postés 597 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 3 février 2020 89
25 juin 2012 à 11:21
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 4313 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 845
26 juin 2012 à 15:52
De rien, merci de ton retour :)
0