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 :

mon motif de regex ne passe pas [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut mon motif de regex ne passe pas
    <EDIT>
    Ne vous embetez pas a lire la premiere page, vous pouvez directement passer a la page 2, où j'explique plus clairement les choses
    </EDIT>

    alors, voila : j'utilise la fonction preg_match en php, avec le motif suivant :

    /<li>.*\[ *testBDD *; *block *= *li *\].*</li>/sU

    donc je fait :

    preg_match("/<li>.*\[ *testBDD *; *block *= *li *\].*</li>/sU", $template, $block);

    et non seulement $block ne prend pas de valeur, masi en plus j'ai l'erreure suivante :

    Warning: Unknown modifier 'l' in e:\action1 framework\index.php on line 98

    avant de mettre les option "sU", j'avait vette erreure :
    preg_match("<li>.*\[ *testBDD *; *block *= *li *\].*</li>", $template, $block);

    Warning: Unknown modifier '.' in e:\action1 framework\index.php on line 98

    pouvez vous m'aider a comprendre svp? c'est la premiere fois que j'utilise les regex et j'ai un peu de mal...
    merci d'avance

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("/<li>.*\[ *testBDD *; *block *= *li *\].*</li>/sU", $template, $block);
    Pour lui, / est un séparateur. donc il y a un soucis au niveau de </li>

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et donne un exemple de ce que tu veux transformer en quoi ca nous aiderait à t'aider

  4. #4
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    c'est pour un eptit moteur de template que je developpe pour une action de BTS.

    ce que je veut transformer par exemple c'est :

    <li>
    [testBDD;block = li]
    nom : [testBDD; nom] , l'activitée est : [ testBDD ;libelle]
    </li>

    je fait toute une serie de regex, toutes marchent sauf celle ci, a l'origine, elle marchait, mais l'expression que j'utilisait etait "gourmande" et prenait le dernier </li> trouvé...
    je l'ai donc modifié, et n'arrive plus du tout a la faire fonctionner. ( j'utilisait la fonction ereg dans une boucle, et ereg n'a pas la meme syntaxe, je croit.)

    suite a vos conseils, j'ai testé :
    "/<li>.*\[ *testBDD *; *block *= *li *\].*<\/li>/sU"

    et ca marche, MERCI!! (beaucoup)

  5. #5
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Heu... en fait ca marche, mais j'ai maintenant un pb avec ma premiere balise <li>...
    elle est lut de facon gourmande : ca prend la plus "haute" possible dans ma page...
    faut que je l'anule avec ? c'est bien ca?

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Tu veux transformer quoi en quoi ?

  7. #7
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    alors...
    je fait un moteur de template.
    donc je prend une page html vide de toutes données.
    elle comprend juste des "balsies" qui seront substituée par mon moteur par des valeurs.

    pour ce faire j'ai deux types de balises :
    - celles qui definissent les bloque a repliquer dans lequel elles sont incluses
    - des balises adjacentes a celles de definitioon de block (situées dans le meme block) qui seront remplacées par les valeurs coté php.

    le block decrit sera duplliqé autant de fois qu'il y a d'ocurences de l'information.
    (ais-je ete clair ? je suis pas sur)

    donc, ce que je cherche a faire dans la partie qui me pose probleme, c'est recupérer la balise de block (ok), lire le bloque qu'elle indique (ok) extraire ce block du code html (aïe) puis le dupliquer et le renseigner des bonnes valeures (ok).

    donc mon pb se pose au niveau de la detection/extraction du block HTML.

    c'est a dire , toujours dna mon exemple :

    <li> bla bla bla bla bla </li>

    j'arrive bien a detecter ce block, mias si j'ai :
    <li> pas bon, ne pas prendre </li>
    <li> block a prendre </li>
    <li> pas bon aussi </li>

    il me prend le "block" li du dessus. (je suis arrivé a rendre l'expression non gourmande "vers le bas", mais pas "vers le haut")
    [/u]

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est quoi une expression gourmande ?

    Sinon de manière générale les exemples valent mieux que les longs discours parce que là il faut s'y prendre plusieurs fois pour essayer de comprendre...

    Juste une question comme ca car je suis une quiche en expr reg, c'est quoi les modifieurs s et U ?

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    en fait il te prend tout.
    Si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <li>[testBDD;block=li]123</li>
    <li>[testBDD;block=li]456</li>
    <li>[testBDD;block=li]789</li>
    alors le .* avant ton <\/li> te catch ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    123</li>
    <li>[testBDD;block=li]456</li>
    <li>[testBDD;block=li]789

  10. #10
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    en fait j'avait ce pb au debut, mais je l'ai "resolu" mon pb maintenant, c'est qu'il me prend ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <li>[testBDD;block=li]123</li> 
    <li>[testBDD;block=li]456</li>
    ....

    (il prend "au dessus")

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    quelle est ta regexp finalement ? (entre les balises code please)

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Que fais-tu si tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <li>[testBDD;block=li]1234
         ...
         ...
         <li>[testBDD;block=li]5678</li>
         ...
    </li>
    :

  13. #13
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Mr N.
    Que fais-tu si tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <li>[testBDD;block=li]1234
         ...
         ...
         <li>[testBDD;block=li]5678</li>
         ...
    </li>
    :
    c'est une des limitations de mon code : je ne prend pas en compte ce genre de cas...
    de toute facon, ce n'est pas gérable... vu que je suis censé créer 0..N block suivant le resultat de ma BDD...
    en réalitée, si je croise ce code, mon prog ne s'ocupera que de la premiere occurence .


    mon motif, pour le moment est :
    "/<li>.*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"

  14. #14
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    je vous met la citation de
    http://fr3.php.net/manual/fr/referen....modifiers.php

    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 ?. De même, si cette option est activée, le ? rendra gourmand une 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 quantifieur (.e.g. .*?).

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Moi je suis à la rue là, je peux pas t'aider.

    Une ultime solution dans mon sac : change ton moteur de template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li>nom : <?=nom?>, l'activité est : <?=libelle?></li>
    C'est quand même plus lisible non ? En tout cas chez moi ca marche très bien !
    Bon courage !

  16. #16
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    c'es moi qui l'ai fait ce moteur :'(

    en fait je me suis inspiré de la syntaxe de tinyButStrong afin de le remplaceer facilement.

  17. #17
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    mon motif, pour le moment est :
    "/<li>.*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"

    svp, qqun peut m'aider

    (petit up )

  18. #18
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    je rappelle que mon pb est le suivant :

    mon motif de regex "fonctionne" "bien"
    CAD qu'il va chercher les motif desiré et s'arrete au premier </li> rencontré...

    par contre, il choppe le premier <li> qu'il peut trouver...

    que dois-je faire?

    tient un petite illumination :
    rajouter un (^<li>) ou un truc du genre
    cad :

    "/<li>[.(^<li>)]*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"

    explication du motif :

    <li>.*?
    un <li> suivait de n'importe quel caractere 0 à n fois

    [ *testBDD *; *block *= *li *\]
    le block que je cherche (dans cet exemple)

    .*<\/li>
    n'importe quel caractere 0 à n fois, suivit de </li>

    //sU
    tout ce qui est entre "/ /" (tout mon regexp) devient "non gourmand" cad : il s'arrete a la premiere occurence trouvée et non a la derniere.


    lieu du "blocage" : j'ai un <li>.* et je n'arrive pas a le rendre "non gourmand" cad : il prend le premier <li> trouvé, et non le dernier.

  19. #19
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    bon, je recapitule :

    j'ai créé, pour une action de BTS, un moteur de template.
    une de ses fonctionnalitées est de substituer un "bloque" par "autre chose" (pas important ici)
    pour substituer ce block, je doit tout d'abord l'extraire, pour ce faire, je fait un preg_match() qui me retourne mon block, je fait mes traitemeznts, puis je fait un str_replace() pour substituer le nouveuax block.

    mon pb se situe au niveau du preg_match :
    cette fonction accepte trois parametre.
    L'un d'eux est une expression reguliere.

    cette expression est : (expliquée juste au dessus) :
    "/<li>.*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"

    mon pb :

    au lieu de prendre le dernier <li> disponible, elle prend le premier...cad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <li>  ne pas me prendre mias quand meme pris </li>
    <li>  je veut cette partie </li>
    <li>  ne pas me prendre et ca marche </li>
    donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <li>  ne pas me prendre mias quand meme pris </li>
    <li>  je veut cette partie </li>
    alors que je ne veut que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <li>  je veut cette partie </li>
    meric de votre aide svp ))

  20. #20
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    c'est des expression regulieres, c'est independant du langage utimisé (a quelques execptions pres je pense)!
    eg : La syntaxe des masques utilisés dans ces fonctions ressemble fort à celle de Perl. (cf : http://fr2.php.net/manual/fr/ref.pcre.php)
    don c'est pour ca que je me demande si j'ai bien posté sur le bon forum, mais vu qu'il n'yu a aps de forum regex... et que php me semble un langage gourmand de ce genre de fonctionnalitée...
    please aidez moi!
    j'ai ateind mes limites sur ce sujet, sinon, je vait devoir investir dans un livre parlant de ce sujet (y'en a?) rien que pour une pauvre petite ligne :'(!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RegEx] Mon regex ne fonctionne pas..la variable retourne Array
    Par joboy84 dans le forum Langage
    Réponses: 1
    Dernier message: 09/06/2008, 18h11
  2. pourquoi je ne passe pas dans mon action
    Par fk04 dans le forum Struts 1
    Réponses: 5
    Dernier message: 03/10/2007, 21h20
  3. mon calendrier ne passe pas 2039
    Par acryline dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 07/08/2007, 14h54
  4. [Tableaux] PB mon IF ne passe pas pourquoi ?
    Par foxdream94 dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 12h00
  5. Réponses: 2
    Dernier message: 31/07/2006, 08h48

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