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 :

preg_match ne fonctionnant pas. [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 101
    Par défaut preg_match ne fonctionnant pas.
    Bonjour à tous en cette chaude matinée ^^

    Je début avec les expressions régulière d'où mon problème.

    Je dois supprimer une suite de caractère dans une chaine, pour cela j'ai besoin des expressions régulières.

    Exemple de texte en entrée :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <TABLE CLASS='tab_menu'>
    <TR>
    <COURANT-175>
    <TD>Press review</TD>
    </COURANT-175>
    <PAS-COURANT-175>
    <TD><A CLASS='a_menu' HREF='{$CHEMIN-PAGES$}revue-de-presse.html'>Press review</A></TD>
    </PAS-COURANT-175>
    </TR>
    </TABLE>

    Et je dois obtenir le résultat suivant:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <TABLE CLASS='tab_menu'>
    <TR>
    <COURANT-175>
    <TD>Press review</TD>
    </COURANT-175>
    </TR>
    </TABLE>

    J'utilise donc le code suivant pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
           $texte = "<TABLE CLASS='tab_menu'>
    <TR>
    <COURANT-175>
    <TD>Press review</TD>
    </COURANT-175>
    <PAS-COURANT-175>
    <TD><A CLASS='a_menu' HREF='{$CHEMIN-PAGES$}revue-de-presse.html'>Press review</A></TD>
    </PAS-COURANT-175>
    </TR>
    </TABLE>";
     
            echo htmlentities($texte)."<br/>";
     
            $texte = preg_replace("#<PAS-COURANT-[0-9]+>.*<\/?PAS-COURANT-[0-9]+>#", "", $texte);
     
            echo htmlentities($texte);
    ?>
    Après le preg_replace je m'attends donc à ce qu'il ne me reste que :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <TABLE CLASS='tab_menu'>
    <TR>
    <COURANT-175>
    <TD>Press review</TD>
    </COURANT-175>
    </TR>
    </TABLE>

    Or le texte reste inchangé.
    Je pense donc que je regex ne fonctionne pas, mais je ne sais pas pourquoi

    Merci de votre aide. Bonne journée.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Par défaut
    http://us.php.net/manual/fr/referenc....modifiers.php

    s (PCRE_DOTALL)
    Avec cette option, le métacaractère point (.) remplace n'importe quel caractère, y compris les nouvelles lignes. Sans cette option, le caractère point ne remplace pas les nouvelles lignes. Cette option est équivalente à l'option Perl /s. Une classe de caractères négative telle que [^a] acceptera toujours les caractères de nouvelles lignes, indépendamment de cette option.
    Rajoute donc l'option "s" juste après le # en fin de regexp.

    Et si tu manipules plus souvent du HTML comme ça, pense à utiliser un outil plus adapté, par ex. :
    http://simplehtmldom.sourceforge.net/

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 101
    Par défaut
    Effectivement ca marche merci beaucoup !

    Par la même occasions autre soucis..

    Une fois quelques opérations faites, de mon texte en entrée il me reste ca :

    <TABLE CLASS='tab_menu'>
    <TR>

    <TD>Présentation</TD>

    <COURANT-176>
    <TD>Oeuvres</TD>
    </COURANT-176>

    <TD>
    <A CLASS='a_menu' HREF='{$\CHEMIN-PAGES$}{$\LIEN-PAGE-471$}'>Oeuvres</A>
    </TD>

    <COURANT-175>
    <TD>Revue de presse</TD>
    </COURANT-175>

    <TD>
    <A CLASS='a_menu' HREF='{$\CHEMIN-PAGES$}revue-de-presse.html'>Revue de presse</A>
    </TD>

    </TR>
    </TABLE>


    Je dois ensuite terminer en supprimant les "phrases" <COURANT-xxx>...</COURANT-xxx> donc dans mon exemple je veux supprimer :

    - <COURANT-176>
    <TD>Oeuvres</TD>
    </COURANT-176>


    et
    - <COURANT-175>
    <TD>Revue de presse</TD>
    </COURANT-175>


    J'utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace("#<COURANT-[0-9]+>.*<\/COURANT-[0-9]+>$#is", "", $texte);
    Le soucis c'est que .* signifiant TOUT les caractères en fait il me supprime :
    "<COURANT-176>
    <TD>Oeuvres</TD>
    </COURANT-176>

    <TD>
    <A CLASS='a_menu' HREF='{$\CHEMIN-PAGES$}{$\LIEN-PAGE-471$}'>Oeuvres</A>
    </TD>


    <COURANT-175>
    <TD>Revue de presse</TD>
    </COURANT-175>"


    J'ai compris que c'était parce-que
    "<TD>
    <A CLASS='a_menu' HREF='{$\CHEMIN-PAGES$}{$\LIEN-PAGE-471$}'>Oeuvres</A>
    </TD>"

    se trouve entre <COURANT-176> et /COURANT-175> mais ca me pose un soucis car je ne dois pas le supprimer.

    Comment puis-je dire à ma regex que TOUT les caractères c'est tout SAUF "<COURANT.." ???
    J'ai essayé en faisant ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace("#<COURANT-[0-9]+>[^COURANT .]*<\/COURANT-[0-9]+>$#is", "", $texte);
    Mais ca ne fonctionne pas.Soi il ne me supprime rien soit tout...

    Merci de votre aide.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Par défaut
    U (PCRE_UNGREEDY)
    Cette option inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ? mais cela rendra gourmand la séquence. Cette option n'est pas compatible avec Perl. Elle peut aussi être mise dans le masque avec l'option ?U dans le pattern ou par un point d'interrogation avant le quantificateur (.e.g. .*?).
    Rajoute cette option. Attention, ça ne suffira pas si tes tags <COURANT> peuvent être imbriqués.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 101
    Par défaut
    Merci je test mais en tout cas il est impossible que l'on est <COURANT-xx> <COURANT-xxx> ..... </COURANT-xx></COURANT-xx>

    Car en fait il s'agit d'un script qui modifie un texte pour ne laisser que le code HTML qui va créer le menu.

    Et un item de menu est soit courant (on est dessus après l'avoir cliqué) soit pas courant (on n'a pas cliqué dessus donc on est pas sur sa page).

    [EDIT]
    L'option u ne fonctionne pas.

    Quand j'execute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace("#<COURANT-[0-9]+>.*<\/COURANT-[0-9]+>#isu", "", $texte); //Suppression des "phrases" COURANT
    Ca me supprime toujours
    <TD>
    <A CLASS='a_menu' HREF='{$\CHEMIN-PAGES$}{$\LIEN-PAGE-471$}'>Oeuvres</A>
    </TD>




    [/EDIT]

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Par défaut
    U, pas u !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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