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 -
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 :
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
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:
- Problème avec une regexp (php)
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
4 réponses
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 .* :)
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 .* :)
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=">" ...)
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=">" ...)
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 :
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 !
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 !
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.