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 :

Recherche du bon pattern pour une expression régulière


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut Recherche du bon pattern pour une expression régulière
    Bonjour à tous,

    Je suis à la recherche du bon pattern pour expression régulière.
    Voilà ce que j'ai fait pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $reg = '#(<li class[^>]+>)(<a href[^>]+>)(.*)(</a>)(</li>)#iD';
    $rep = $before.'$1$2$3$4$5'.$after;
    $str = preg_replace($reg, $rep, $str);
    qui fonctionne très bien et qui me permet d'ajouter un élément soit avant, soit après mon élément li.

    Mon problème est que cette liste me sert à générer dynamiquement un menu et lorsqu'il y a des éléments de sous menu on intègre (Wordpress) une balise ul à l'intérieur de la balise li de l'élément parent de menu.

    Du coup il faudrait quelque choses comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $reg = '#(<li class[^>]+>)(<a href[^>]+>)(.*)(</a>)(<ul><li class[^>]+><a href[^>]+>.*</a></li></ul>)(</li>)#iD';
    mais ça ne fonctionne pas.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    lorsqu'il y a des éléments de sous menu
    C'est à dire ? Un ou des exemples serai(en)t fort bien venus pour mieux comprendre.

    on intègre (Wordpress) une balise ul à l'intérieur de la balise li de l'élément parent de menu
    C'est à dire ?



    Qu'est ce que tu recherches finalement ? Obtenir quelque chose ou empêcher quelque chose ?
    Quoi ?

    Désolé je ne comprends pas.

  3. #3
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut
    Bonjour, alors pour être plus clair j'utilise wordpress sur un projet et la fonction renvoyant le menu me donne ça :

    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
    19
    20
    21
    22
     
    <ul role="navigation">
    	<li class="page_item page-item-2 current_page_item"><a href="http://localhost/excelsol/v1" title="ACCUEIL">ACCUEIL</a></li>
    	<li class="page_item page-item-4"><a href="http://localhost/excelsol/v1/?page_id=4" title="REALISATION">REALISATION</a>
    		<ul>
    			<li class="page_item page-item-21"><a href="http://localhost/excelsol/v1/?page_id=21" title="sol béton ciré">sol béton ciré</a></li>
    			<li class="page_item page-item-23"><a href="http://localhost/excelsol/v1/?page_id=23" title="murs">murs</a></li>
    			<li class="page_item page-item-25"><a href="http://localhost/excelsol/v1/?page_id=25" title="béton poli">béton poli</a></li>
    			<li class="page_item page-item-28"><a href="http://localhost/excelsol/v1/?page_id=28" title="salle de bains">salle de bains</a></li>
    			<li class="page_item page-item-30"><a href="http://localhost/excelsol/v1/?page_id=30" title="escalier">escalier</a></li>
    			<li class="page_item page-item-32"><a href="http://localhost/excelsol/v1/?page_id=32" title="commerce">commerce</a></li>
    		</ul>
    	</li>
    	<li class="page_item page-item-5"><a href="http://localhost/excelsol/v1/?page_id=5" title="TECHNIQUES">TECHNIQUES</a>
    		<ul>
    			<li class="page_item page-item-9"><a href="http://localhost/excelsol/v1/?page_id=9" title="Béton ciré">Béton ciré</a></li>
    			<li class="page_item page-item-13"><a href="http://localhost/excelsol/v1/?page_id=13" title="Process vitrobeton">Process vitrobeton</a></li>
    			<li class="page_item page-item-11"><a href="http://localhost/excelsol/v1/?page_id=11" title="Sols industriels">Sols industriels</a></li>
    		</ul>
    	</li>
    	<li class="page_item page-item-17"><a href="http://localhost/excelsol/v1/?page_id=17" title="NEWS">NEWS</a></li>
    </ul>
    Mon objectif est de pouvoir ajouter à chaque fin de ligne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <li class="seprator"></li>
    Et pour bien faire il faudrait que je puisse aussi supprimer les textes des balises <a...> mais uniquement pour les rubriques de premier niveau (elles sont remplacés par des images dans la css)

    J'espère m'être mieux exprimer

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Mon objectif est de pouvoir ajouter à chaque fin de ligne ça :
    <li class="seprator"></li>

    Pour obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <ul role="navigation"><li class="seprator"></li>
        ....."ACCUEIL">ACCUEIL</a></li><li class="seprator"></li>
        .....N">REALISATION</a><li class="seprator"></li>
            .....<ul><li class="seprator"></li>
                 .....éton ciré</a></li><li class="seprator"></li>
                 .....urs</a></li><li class="seprator"></li>
                 etc
                 .....merce</a></li><li class="seprator"></li>
            .....</ul><li class="seprator"></li>
        </li><li class="seprator"></li>
         .....>TECHNIQUES</a><li class="seprator"></li>
            .....<ul><li class="seprator"></li>
    etc etc
    c'est à dire vraiment à chaque fin de ligne ?



    Ou bien désignes-tu par fin de ligne: '\n' ?

  5. #5
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut
    En faite il faut que j'ajoute cette balise <li class="separator"></li> après chaque balise <li> fermante (</li>).

    Voilà une fonction qui marche mais uniquement pour les catégories qui n'ont pas de sous catégories, matérialisées par le fait que la balise <li> inclue un groupe <ul>...</ul> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function deleteTextMenu ($before = null, $str, $after = null) {
    	$reg = '#(<li class[^>]+>)(<a href[^>]+>)(.*)(</a>)(</li>)#iD';
    	$rep = $before.'$1$2$3$4$5'.$after;
    	$str = preg_replace($reg, $rep, $str);
    	return $str;
    }

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je ne comprends pas tout bien.
    Alors je retiens ceci:

    - il faudrait que je puisse aussi supprimer les textes des balises <a...> mais uniquement pour les rubriques de premier niveau

    - il faut que j'ajoute cette balise <li class="separator"></li> après chaque balise <li> fermante (</li>).
    Je suppose que les rubriques de premier niveau sont celles dont les '<li class' sont les plus à gauche.
    Plutôt que de les caractériser comme étant « les catégories qui n'ont pas de sous catégories, matérialisées par le fait que la balise <li> inclue un groupe <ul>...</ul> » ,
    je pense qu'il est plus pratique de rester sur cette idée de 'plus à gauche':
    ces catégories sont celles qui n'ont qu'une unité de tabulation en tête de ligne.

    Quand je parle d'une unité de tabulation il s'agit d'un espace spécifié par '\t' dans la chaîne qui est affichée.

    Pour visualiser s'il s'agit d'une unité de tabulation ou de plusieurs espaces, il suffit de placer le curseur en tète de ligne et d'appuyer une fois sur la flèche -> du clavier;
    mais il est préférable d'utiliser une fonction qui affiche les caractères présents dans une chaîne sans les interpréter comme instruction d'affichage. En Python il s'agit de repr() et son usage sur ta chaîne donne:



    '<ul role="navigation">\n\t<li class="page_item page-item-2 current_page_item"><a href="http://localhost/excelsol/v1" title="ACCUEIL">ACCUEIL</a></li>\n\t<li class="page_item page-item-4"><a href="http://localhost/excelsol/v1/?page_id=4" title="REALISATION">REALISATION</a>\n\t\t<ul>\n\t\t\t<li class="page_item page-item-21"><a href="http://localhost/excelsol/v1/?page_id=21" title="sol b\xe9ton cir\xe9">sol b\xe9ton cir\xe9</a></li>\n\t\t\t<li class="page_item page-item-23"><a href="http://localhost/excelsol/v1/?page_id=23" title="murs">murs</a></li>\n\t\t\t<li class="page_item page-item-25"><a href="http://localhost/excelsol/v1/?page_id=25" title="b\xe9ton poli">b\xe9ton poli</a></li>\n\t\t\t<li class="page_item page-item-28"><a href="http://localhost/excelsol/v1/?page_id=28" title="salle de bains">salle de bains</a></li>\n\t\t\t<li class="page_item page-item-30"><a href="http://localhost/excelsol/v1/?page_id=30" title="escalier">escalier</a></li>\n\t\t\t<li class="page_item page-item-32"><a href="http://localhost/excelsol/v1/?page_id=32" title="commerce">commerce</a></li>\n\t\t</ul>\n\t</li>\n\t<li class="page_item page-item-5"><a href="http://localhost/excelsol/v1/?page_id=5" title="TECHNIQUES">TECHNIQUES</a>\n\t\t<ul>\n\t\t\t<li class="page_item page-item-9"><a href="http://localhost/excelsol/v1/?page_id=9" title="B\xe9ton cir\xe9">B\xe9ton cir\xe9</a></li>\n\t\t\t<li class="page_item page-item-13"><a href="http://localhost/excelsol/v1/?page_id=13" title="Process vitrobeton">Process vitrobeton</a></li>\n\t\t\t<li class="page_item page-item-11"><a href="http://localhost/excelsol/v1/?page_id=11" title="Sols industriels">Sols industriels</a></li>\n\t\t</ul>\n\t</li>\n\t<li class="page_item page-item-17"><a href="http://localhost/excelsol/v1/?page_id=17" title="NEWS">NEWS</a></li>\n</ul>\n'

    Je ne comprends pas quel rôle jouent l'existence de 5 groupes capturant dans ta RE.
    J'ai donc fait à ma manière, i.e. en Python , car je ne sais pas écrire de code bien poussé en PHP.

    J'espère que mon code puisse t'inspirer et être facilement transcrit en PHP. Cela consistera à utiliser une fonction preg_replace_callback() avec une fonction auxiliaire; je ne vois pas comment faire autrement.

    L'option re.M est l'analogue de l'option m de PHP.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    def yoop(m):
        if   m.group(4):  return m.group(4)+'<li class="separator"></li>'
        elif m.group(3):  return m.group(1)+'</li><li class="separator"></li>'
        else           :  return m.group(1)
     
    import re
    pat = re.compile('(?:(^\t<li class="page_item page-item-.+?>)'\
                     '(<a href="http://localhost/excelsol/v1.+?</a>)?.*?(</li>)?)'\
                     '|(^.*?</li>)',re.M)
     
    ch = '''<ul role="navigation">
    	<li class="page_item page-item-2 current_page_item"><a href="http://localhost/excelsol/v1" title="ACCUEIL">ACCUEIL</a></li>
    	<li class="page_item page-item-4"><a href="http://localhost/excelsol/v1/?page_id=4" title="REALISATION">REALISATION</a>
    		<ul>
    			<li class="page_item page-item-21"><a href="http://localhost/excelsol/v1/?page_id=21" title="sol béton ciré">sol béton ciré</a></li>
    			<li class="page_item page-item-23"><a href="http://localhost/excelsol/v1/?page_id=23" title="murs">murs</a></li>
    			<li class="page_item page-item-25"><a href="http://localhost/excelsol/v1/?page_id=25" title="béton poli">béton poli</a></li>
    			<li class="page_item page-item-28"><a href="http://localhost/excelsol/v1/?page_id=28" title="salle de bains">salle de bains</a></li>
    			<li class="page_item page-item-30"><a href="http://localhost/excelsol/v1/?page_id=30" title="escalier">escalier</a></li>
    			<li class="page_item page-item-32"><a href="http://localhost/excelsol/v1/?page_id=32" title="commerce">commerce</a></li>
    		</ul>
    	</li>
    	<li class="page_item page-item-5"><a href="http://localhost/excelsol/v1/?page_id=5" title="TECHNIQUES">TECHNIQUES</a>
    		<ul>
    			<li class="page_item page-item-9"><a href="http://localhost/excelsol/v1/?page_id=9" title="Béton ciré">Béton ciré</a></li>
    			<li class="page_item page-item-13"><a href="http://localhost/excelsol/v1/?page_id=13" title="Process vitrobeton">Process vitrobeton</a></li>
    			<li class="page_item page-item-11"><a href="http://localhost/excelsol/v1/?page_id=11" title="Sols industriels">Sols industriels</a></li>
    		</ul>
    	</li>
    	<li class="page_item page-item-17"><a href="http://localhost/excelsol/v1/?page_id=17" title="NEWS">NEWS</a></li>
    </ul>'''
    print pat.sub(yoop,ch)

    Résultat:

    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
    19
    20
    21
    <ul role="navigation">
    	<li class="page_item page-item-2 current_page_item"></li><li class="separator"></li>
    	<li class="page_item page-item-4">
    		<ul>
    			<li class="page_item page-item-21"><a href="http://localhost/excelsol/v1/?page_id=21" title="sol béton ciré">sol béton ciré</a></li><li class="separator"></li>
    			<li class="page_item page-item-23"><a href="http://localhost/excelsol/v1/?page_id=23" title="murs">murs</a></li><li class="separator"></li>
    			<li class="page_item page-item-25"><a href="http://localhost/excelsol/v1/?page_id=25" title="béton poli">béton poli</a></li><li class="separator"></li>
    			<li class="page_item page-item-28"><a href="http://localhost/excelsol/v1/?page_id=28" title="salle de bains">salle de bains</a></li><li class="separator"></li>
    			<li class="page_item page-item-30"><a href="http://localhost/excelsol/v1/?page_id=30" title="escalier">escalier</a></li><li class="separator"></li>
    			<li class="page_item page-item-32"><a href="http://localhost/excelsol/v1/?page_id=32" title="commerce">commerce</a></li><li class="separator"></li>
    		</ul>
    	</li><li class="separator"></li>
    	<li class="page_item page-item-5">
    		<ul>
    			<li class="page_item page-item-9"><a href="http://localhost/excelsol/v1/?page_id=9" title="Béton ciré">Béton ciré</a></li><li class="separator"></li>
    			<li class="page_item page-item-13"><a href="http://localhost/excelsol/v1/?page_id=13" title="Process vitrobeton">Process vitrobeton</a></li><li class="separator"></li>
    			<li class="page_item page-item-11"><a href="http://localhost/excelsol/v1/?page_id=11" title="Sols industriels">Sols industriels</a></li><li class="separator"></li>
    		</ul>
    	</li><li class="separator"></li>
    	<li class="page_item page-item-17"></li><li class="separator"></li>
    </ul>

Discussions similaires

  1. définition de pattern pour les expressions régulières
    Par hadler dans le forum Général Java
    Réponses: 2
    Dernier message: 04/12/2009, 14h23
  2. Besoin d'aide pour une expression régulière
    Par chlon dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/07/2009, 16h41
  3. [RegEx] Besoin d'aide pour une expression régulière
    Par vallica dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2007, 19h59
  4. [RegEx] Aide pour une expression réguliére.
    Par mr_keyser dans le forum Langage
    Réponses: 9
    Dernier message: 15/06/2007, 10h27
  5. Besoin d'aide pour une expression régulière
    Par planetiss dans le forum Langage
    Réponses: 5
    Dernier message: 16/02/2006, 19h04

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