Problème avec une regexp (php)
Résolu/Fermé
Kopros
Messages postés
595
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 4315 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 - 26 juin 2012 à 15:52
Mihawk Messages postés 4315 Date d'inscription mercredi 29 mars 2006 Statut Contributeur Dernière intervention 6 janvier 2015 - 26 juin 2012 à 15:52
A voir également:
- Problème avec une regexp (php)
- Easy php - Télécharger - Divers Web & Internet
- \R php ✓ - Forum PHP
- Php if plusieurs conditions ✓ - Forum PHP
- Br php ✓ - Forum PHP
- Echo image php ✓ - Forum PHP
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
19 juin 2012 à 19:23
essayes:
$content=preg_replace('/(<img src="'.$src.'" \/>)/i', '', $result[$f]);
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
20 juin 2012 à 10:38
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 .* :)
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=">" ...)
Kopros
Messages postés
595
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
3 février 2020
89
25 juin 2012 à 11:21
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 :
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 !
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
26 juin 2012 à 15:52
26 juin 2012 à 15:52
De rien, merci de ton retour :)
20 juin 2012 à 10:28
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.