Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/05/2005, 03h54   #1
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
Par défaut Regex inverse

Bonjour,

Voici un bout de code qui me permet de supprimer les balises (et les propriétés internes) que je ne souhaite pas lorsque je récupère une chaine de texte issue d'un wysiwyg.

Code :
1
2
3
4
5
	$html=htmlentities($html, ENT_QUOTES);
	$balises='table|div|p';	
	$in='(<(/?(?:'.$balises.')\b[^"]*?)>)ies';
	$html=preg_replace($in, 'strtolower(html_entity_decode("\0"))', $html);
	echo preg_replace('/<img\b[^"]*?>/ies', 'str_replace("\0", "")', $html);
Voila j'aimerais maintenant indiquer les balises que j'autorise et supprimer toutes les autres mais je n'arrive pas à modifier le masque regex.

Comment réaliser le masque inverse ?

Merci.
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2005, 08h57   #2
Invité de passage
 
Inscription : mai 2005
Messages : 1
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 1
Points : 1
Points : 1
tu peux mettre les tag entre commentaire exemple :

<br /> devient <!--<br />--> apres tu n'as plus qu'a enlever les <!-- et -->
GAME2OVR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2005, 14h10   #3
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
Salut je ne vois pas grand interêt.

J'ai juste besoin du masque inverse.
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2005, 17h43   #4
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
Petite précision voici le masque :

Code :
(<(/?(?:table|div|p)\b[^"]*?)>)ies
J'ai essayé avec [^table|div|p] mais sans succès.
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2005, 20h49   #5
Membre éclairé
 
Avatar de Huntress
 
Inscription : août 2004
Messages : 454
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 454
Points : 339
Points : 339
Je comprends pas trop pourquoi les regex... si tu veux retirer certaines balises et pas d'autres, tu fais un str_replace sur un tableau contenant les balises que tu ne veux pas dans ta chaine, nan ?
__________________

Règle n°1 du forum francophone : Parler le français...
Pas de question technique par MP, le forum est fait pour çà, merci.
Huntress est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2005, 21h46   #6
Membre actif
 
Avatar de doof
 
Inscription : août 2003
Messages : 159
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 159
Points : 153
Points : 153
Salut, ceci ?

Code :
(<(/?(?!table|div|p)\b[^"]*?)>)ies
doof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 02h29   #7
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
Salut Huntress, il y a un nombre incaculable de balise que je ne souhaite pas.

Salut doof :)) Merci, toujours là pour me sauver ! Ca marche.

TchaÔ ^^
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 04h44   #8
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
Une question dans le même ordre d'idée.
Pour remplacer par exemple <hr style="....."> par <hr />

Cela marche très bien mais je comprend pas le masque.

Code :
1
2
$html='<br ><HR test test >';
$txt=preg_replace('/&lt;(HR|hr|br)\b[^"]*?&gt;/', '<\1 />', $txt);

Je suppose que \b[^"]*? représente "toute chaine de texte" mais je comprend pas pourquoi ça ne marche pas avec .* puisque j'ai cru lire cette méthode dans les tutos.

Code :
1
2
$html='<br ><HR test test >';
$txt=preg_replace('/&lt;(HR|hr|br).*&gt;/', '<\1 />', $txt);
Et puis enfin, est-il possible de rendre le masque insenssible à la case.

Merci !
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 05h07   #9
Membre actif
 
Avatar de doof
 
Inscription : août 2003
Messages : 159
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 159
Points : 153
Points : 153
Citation:
Je suppose que \b[^"]*? représente "toute chaine de texte"
Le \b est une assertion qui recherche une limite de mot (caracteres alphanumeriques), donc en l'occurence la fin du nom de la balise.

le [^"]*? veut dire toute chaine qui ne contient pas de ", le resultat le plus petit possible serat pris grace au ? ... D'ailleurs j'ai du mal a comprendre pourquoi tu veux éviter les guillemets ici (peut etre pour ne pas traiter les attributs de balises ?)

Citation:
mais je comprend pas pourquoi ça ne marche pas avec .* puisque j'ai cru lire cette méthode dans les tutos.
hmm, le .* s'il n'est pas suivit d'un ? va rechercher l'expression la plus longue donc aller jusqu'a la fin de la ligne s'il n'y a pas l'option s voir jusqu'a la fin du texte entier si elle est présente. donc .*? serait mieux.
Citation:
Et puis enfin, est-il possible de rendre le masque insenssible à la case.
oui, pour celà il suffit de l'option i comme dans tes masques précedants.
doof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 15h17   #10
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
D'accord merci bcp doof pr tes explications.

C'est assez complexe finalement avec les débuts et fin de ligne.

Dans mon esprit avec cela '/&lt;(hr|br).*&gt;/i' il continu tant que ya du texte ou pas et s'arrête à la première balise fermante.
Enfin c'est comme ça que je conçois mes htaccess et à priori ça marche.

Je garde ça au final :
Code :
preg_replace('/&lt;(hr|br).*?&gt;/i', '<\1 />', $txt);
Mise à part le pdf dispo sur le site, avez vous des tutos pointus sur les regex ?

Merci
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 20h59   #11
Membre actif
 
Avatar de doof
 
Inscription : août 2003
Messages : 159
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 159
Points : 153
Points : 153
Citation:
Dans mon esprit avec cela '/&lt;(hr|br).*&gt;/i' il continu tant que ya du texte ou pas et s'arrête à la première balise fermante.
il s'arete a la derniere balise fermante, ce qui parait plutot logique : .* veut bien dire n'importe quel caractere, donc les premieres balises fermantes sont considérées faire parti de ces caracteres possibles.

En fait, c'est le comportement "gourmand" par défaut des regex qui fait ca, pour le rendre non gourmand, soit tu fait suivre le * par un ? soit tu rajoute l'option U (pour "ungreedy") qui rendra tout ton motif non gourmand.

Euh, pour des bons tutos "avancés", il y a cette partie de la doc bien que succinte, elle est plutot complete :
http://doc.domainepublic.net/php/doc.php.court/regexp.introduction.html
peut être celle ci qui aborde légérement les assertions :
http://www.phpinfo.net/articles/article_regex2.html
Et vraiment complet en anglais :
http://www.regular-expressions.info/tutorial.html
doof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2005, 22h54   #12
Membre régulier
 
Inscription : avril 2003
Messages : 335
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 335
Points : 82
Points : 82
J'te remercie pour ton aide précieuse depuis le début.
Je vais aller lire tout ça.

Ciao :)
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h05.


 
 
 
 
Partenaires

Hébergement Web