IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Regex inverse [FAQ] [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    tu peux mettre les tag entre commentaire exemple :

    <br /> devient <!--<br />--> apres tu n'as plus qu'a enlever les <!-- et -->

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Salut je ne vois pas grand interêt.

    J'ai juste besoin du masque inverse.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    Petite précision voici le masque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<(/?(?:table|div|p)\b[^"]*?)>)ies
    J'ai essayé avec [^table|div|p] mais sans succès.

  5. #5
    Membre averti Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 402
    Points
    402
    Par défaut
    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.

  6. #6
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Salut, ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<(/?(?!table|div|p)\b[^"]*?)>)ies

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    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Ô ^^

  8. #8
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  9. #9
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    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 ?)

    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.
    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.

  10. #10
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    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

  12. #12
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Points : 133
    Points
    133
    Par défaut
    J'te remercie pour ton aide précieuse depuis le début.
    Je vais aller lire tout ça.

    Ciao :)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Juste inverser une regex
    Par dicotout dans le forum Langage
    Réponses: 1
    Dernier message: 03/06/2013, 22h07
  2. [RegEx] Inverser REGEX pour extraire date
    Par MagicManu dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2007, 14h05
  3. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo