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 :

Sortir des paramètres présents ou pas d'une balise [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut Sortir des paramètres présents ou pas d'une balise
    Bonjour à tous,

    J'essaie de créer un parseur de balise personnel. J'ai déja fait quelque chose de la sorte voir ici Mais cette fois ci, c'est différent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $regex = '{
        \[WCLINK \s+                                   # ca commence par [WCLINK avec un ou des blancs
        id=\'? (.+?) \'? \]                         # capture de l\'attribut id avec ou sans quotes
        ( (?: [^\[] | \[ (?!/?WCLINK) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/WCLINK\]                                    # et ça finit par [/WCLINK]
        }Six';                                      # S pour optimiser le moteur, i pour la casse, x pour l\'espacement et les commentaires

    Ce regex est utilisé via cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace_callback($regex, 'parseRec', $myString);


    Ca me sort un tableau avec

    [0] = id
    [1] = le valeur entre les balises


    Mon problème ici est qu'il peut y avoir plusieur paramètre et qu'ils ne sont pas obligatoire exemple:


    [WCLINK]Lien[/WCLINK]

    [WCLINK id_cp=Ftg]Lien[/WCLINK]

    [WCLINK id_cp=Ftg hover=A]Lien[/WCLINK]

    [WCLINK hover=A id_cp=Ftg]Lien[/WCLINK]

    [WCLINK hover=A]Lien[/WCLINK]

    La liste des paramètres possibles est ID_WC ID_CP ID_CP2 CLICK HOVER

    Actuellement j'arrive à isoler le contenu et une chaine contenant les paramètres. Mais ensuite je dois à nouveau traiter cette chaine et j'aimerais que tout se fasse en un seul traitement

    Pour le moment j'ai pour

    [WCLINK id_cp=Ftg hover=A]Lien[/WCLINK]

    Avec le regex modifiés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $regex = '{
        \[WCLINK \s+                                   # ca commence par [WCLINK avec un ou des blancs
        \'? (.+?) \'? \]                         # capture de l\'attribut id avec ou sans quotes
        ( (?: [^\[] | \[ (?!/?WCLINK) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/WCLINK\]                                    # et ça finit par [/WCLINK]
        }Six';                                      # S pour optimiser le moteur, i pour la casse, x pour l\'espacement et les commentaires

    [0]="id_cp=Ftg hover=A"
    [1]="Lien"


    Donc deux possibilités :


    1/ modifier le regex initial pour qu'il me sort un tableau du genre

    [0]=>id_cp
    [1]=>'valeur id_cp'
    [2]=>hover
    [3]=>'valeur hover'
    [4]=>contenu

    2/ créer un second regex qui parse ma chaine contenant les paramètres pour avoir


    T1[0]=>chaine paramètre
    T1[1]=>contenu

    T2[0]=>id_cp
    T2[1]=>'valeur id_cp'
    T2[2]=>hover
    T2[3]=>'valeur hover'

    Mais niveau performance, je pense que la solution 1 est meilleure mais je sèche


    A partir de la chaine suivant "id_cp=Ftg hover=A"

    comment obtenir le tableau suivant

    [0]=>'id_cp'
    [1]=>'Ftg'
    [2]=>'hover'
    [3]=>'A'

    ou mieux encore

    'id_cp'=>'Ftg'
    'hover'=>'A'



    Voila pour le casse tête... bon amusement ;-)

    Merci,

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Sympa le problème. Je vais mater ça cet après-midi.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Un début de piste :

    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
     
    $str = '[WCLINK id_cp=Ftg hover=A]Lien[/WCLINK]';
     
    $reg = '
    {
    \[WCLINK \s+                                   # ca commence par [WCLINK avec un ou des blancs
    \'? (.+?) \'? \]                               # capture de l\'attribut id avec ou sans quotes
    ( (?: [^\[] | \[ (?!/?WCLINK) | (?R) )+ )      # capture récursive de la valeur entre balises
    \[/WCLINK\]                                    # et ça finit par [/WCLINK]
    }Six';
     
    preg_match($reg, $str, $m);
    print_r(parse($m));
     
    function parse($match) {
        $result   = preg_split('/[=\s]/', $match[1]);
        $result[] = $match[2];
        return $result;
    }
    mais cela doit-il être récursif ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    En fait non car il n'y a pas de lien dans un lien. J'ai réutilisé l'ancien code que tu avais fait dans l'autre topic qui lui est bien récursif.

    Donc il est possible d'avoir

    blabla [WCLINK param...]content[/WCLINK] blabla [WCLINK param...]content[/WCLINK] blabla

    Et cela doit donner

    blabla LINK1 blabla LINK2 blabla

    Et pour générer les LINK j'ai besoin des paramètres.


    Si on a


    [WCLINK param...]blabla [WCLINK param...]content[/WCLINK] blabla[/WCLINK]

    Le WCLINK du milieu ne doit pas être interpreter

    Je vais tester ta proposition ce soir.


    Merci,


    PS: Content de te voir... C'est déja toi qui était à l'origine de la solution du topic cité dans le premier post.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    J'ai testé et ça fonctionne mais mais dans le cas ou il y a plusieurs [WCLINK]. J'essaie d'intégrer un mettre un preg_match_all

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Voila j'ai adapté et je pense que ça fonctionne

    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
     
     
    $str = '[WCLINK id_cp=Ftg hover=A]Lien[/WCLINK] ';
    $str .= 'blabla [WCLINK id_cp=kjh hover=B]Lien2[/WCLINK]';
     
    $reg = '
    {
    \[WCLINK \s+                                   # ca commence par [WCLINK avec un ou des blancs
    \'? (.+?) \'? \]                               # capture de l\'attribut id avec ou sans quotes
    ( (?: [^\[] | \[ (?!/?WCLINK) | (?R) )+ )      # capture récursive de la valeur entre balises
    \[/WCLINK\]                                    # et ça finit par [/WCLINK]
    }Six';
     
    preg_match_all($reg, $str, $m);
     
    foreach($m[1] as $k=>$v){
      $m[1][$k]=parse($m[2][$k],$m[1][$k]);
    }
     
    print_r(parse($m[1]));
     
    function parse($v,$p) {
        $result   = preg_split('/[=\s]/', $p);
        $result[] = $v;
        return $result;
    }
    Le résultat est mis dans $m[1]. Je n'ai pas encore regardé les cas particuliers !

    Enfin c'est la solution 2/ avec 2 preg_*** par lien. Faut voir niveau performance. Et ajouter la notion de "replace"

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par vodnok Voir le message
    En fait non car il n'y a pas de lien dans un lien. J'ai réutilisé l'ancien code que tu avais fait dans l'autre topic qui lui est bien récursif.

    Donc il est possible d'avoir

    blabla [WCLINK param...]content[/WCLINK] blabla [WCLINK param...]content[/WCLINK] blabla
    Mais peut-on avoir ceci :

    blabla [WCLINK param...]content blabla [WCLINK param...]content[/WCLINK] blabla[/WCLINK]

    ?

    Sinon, pas besoin de récursivité, ce qui améliorera sensiblement les perfs je pense
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    En attendant ta réponse...

    Si les liens ne peuvent pas s'imbriquer et qu'il n'y a pas d'autre balise dedans, je simplifierais comme ceci :

    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
    .
    <?php
    $str = '[WCLINK id_cp=Ftg hover=A]Lien[/WCLINK] blabla [WCLINK id_cp=kjh hover=B]Lien2[/WCLINK]';
     
    $reg = '
    {
    \[WCLINK \s+    # ca commence par [WCLINK avec un ou des blancs
    ([^\'\]]+) \]   # capture des attributs (si quote, il faut penser à autre chose...)
    ( [^\[]+ )      # capture de la valeur entre balises
    \[/WCLINK\]     # et ça finit par [/WCLINK]
    }Six';
     
    preg_match_all($reg, $str, $matches);
     
    $nbLiens = count($matches[0]);
     
    $result = array();
     
    for($i=0; $i<$nbLiens; $i++) {
        $buffer   = preg_split('/=|\s+/', $matches[1][$i]);
        $buffer[] = $matches[2][$i];
        $result[] = $buffer;
    }
     
    print_r($result);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Salut,

    Voila je pense être arriver à mes fins !


    Objectif transformer une chaine de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $str="Ceci est un [wclink id_wc='ert' id_cp='vjh' id_cp2='oki' click='NA' hover='ICP']Lien1[/wclink]";
    $str.=" et ceci également [wclink id_wc='ert2' id_cp='vjh' id_cp2='oki' click='NA' hover='ICP']Lien2[/wclink] wazup";
    En

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ceci est un Lien1 Et ceci également Lien2 wazup
    Lien 1 et 2 étant des liens avec quelques options magiques ;-)


    Voici la fonction

    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
     
    $GLOBALS['wcLinkParseRegex']= '{
    	\[WCLINK \s+                                   # ca commence par [WCLINK avec un ou des blancs
    	\'? (.+?) \'?																	 # capture des paramètres avec ou sans quotes
    	\]                         
    	( (?: [^\[] | \[ (?!/?WCLINK) | (?R) )+ )      # capture récursive de la valeur entre balises
    	\[/WCLINK\]                                    # et ça finit par [/WCLINK]
    	}Six';                                         # S pour optimiser le moteur, i pour la casse, x pour l\'espacement et les commentaires
     
    function wcLinkParserRecur($m){
    	if(is_array($m)){
    		if(isset($m[1])&&isset($m[2])){
    			//Appel de la fonction qui génère le lien magique
    			$wcLinkUtils=new wcLinkUtils();
    			return $wcLinkUtils->getGenLink(wcLinkParseParams($m[2],$m[1]));
    		} else return '{NO LINK}';
    	}
    	return preg_replace_callback($GLOBALS['wcLinkParseRegex'], 'wcLinkParserRecur', $m);
    }
     
    function wcLinkParseParams($v,$p){
    	$wcLinkUtils=new wcLinkUtils();
    	//Appel d'une fonction qui rend les éléments paires clés des éléments impaires
    	$result['p']=$wcLinkUtils->getParamTabFormTab(preg_split('/[=\s]/',$p));
    	$result['v']=$v;
    	return $result;
    }
    La fonction qui rend les éléments paires clés des éléments impaires et qui enlève les ' et "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    function getParamTabFormTab($t){
    	$t2=array();
     
    	for($i=0;$i<count($t);$i){
    		if(isset($t[$i])&&isset($t[$i+1]))
    			$t2[$t[$i]]=str_replace(array('\'','"'),'',$t[$i+1]);
    		$i+=2;
    	}
    	return $t2;
    }
    Remarques
    • Les WCLINK imbriqués ne sont pas remplacés. Avec les 3 return
    • J'utilise preg_replace_callback car le but est de remplacer et pas seulement de trouver.
    • Il me reste à tester les performances car certaines pages pourraient avoir une centaine de liens à interpréter. Mais je peux optimiser en réduisant le nombre d'assignation (=) et en mettant le regex en GLOBAL définit une seule fois et en passant ma class wcLinkUtils en singleton



    Voila ça fonctionne.


    Merci beaucoup s.n.a.f.u encore une fois tu as montré que tu étais le roi du regex

  10. #10
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ceci est inutile :
    C'est un peu long à expliquer, mais essaies de rajouter des guillemets à tes paramètres et tu verras.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Ok je vais essayer ça

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

Discussions similaires

  1. Passer des paramètres d'un script shell à une application Java
    Par Kihmé Xs dans le forum Général Java
    Réponses: 4
    Dernier message: 02/05/2012, 22h56
  2. [AC-2003] Sortir des lignes de la base selon une condition
    Par liop49 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 22/03/2010, 10h12
  3. Réponses: 0
    Dernier message: 09/09/2008, 14h12
  4. Réponses: 4
    Dernier message: 15/08/2007, 22h05
  5. Réponses: 2
    Dernier message: 21/07/2007, 01h12

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