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 :

Comment forcer Preg_replace a prendre la plus courte ocurence du motif ?


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Comment forcer Preg_replace a prendre la plus courte ocurence du motif ?
    //message envoyé a CyberZoides, en copie ici

    Salut,
    je viens de regarder ton cours sur les REGEX
    dans lequel je n'ai pas trouvé réponse à ma question

    je me permets donc de te la poser en direct:

    je realise un formatter Html pour un wiki mais en sens inverse:
    je souhaite transformer du html en wikitext.

    j'utilise des expressions regulieres donc (depuis 2 jours..)
    pour rechercher des balisages.

    Ma question est la suivante:

    mettons que j'ai un code comme celui ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <div>
         blbla
    </div>
    <div>
         blublu
    </div>
    lorsque j'utilise (<div>(.*)<\/div>) comme regex,
    il me capture la premiere et la derniere balise alors que je souhaiterais
    comme tu peux l'imaginer, recuperer la premiere et la seconde puis la toisieme avec la quatrieme...
    avec a chaque fois le texte entre les deux..

    je te donne ici un exemple simplifier de mon probleme qui est : comment specifier que l'on souhaite la plus courte occurence du motif, dans le cas ou plusieurs solutions sont possibles ?

    une autre illustration: pour recuperer les images:

    (<img (.+) \/>) il reconnait "<img" puis des caracteres puis "/>" mais je voudrais etre sur qu'il prend bien le Premier "/>" et non pas un autre qui trainerait dans le document comme un <br /> ou je ne sait quoi... (actuellement lorsque j'ai deux images, il prend le premier "<img" et le "/>" de la derniere image..

    Voila
    si tu as des idées ou au moins des liens vers lequel me diriger pour creuser ce problème..

    Merci!

    //et merci à ceux du forum qui auraient des idées!

  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 : 50
    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
    bonjour,

    un petit code vaut mieux que de longues explications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $str = '<div>
    blbla
    </div>
    <div>
    blublu
    </div>';
     
    $reg = '#(<div>(.*?)<\/div>)#s';
     
    if (preg_match($reg, $str, $match))
        print_r ($match);
    idem pou img
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $reg = '#<img (.+?) />#';
    • 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
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut eheh
    merci pour ta reponse

    il m'avais semblé voir cela en effet..
    aurais-tu un lien vers une explication de (.*?)
    (i can't google it )

    en attendant j'avais fait un peu différemment :
    j'ai contourné le probleme en mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #<div>[^<]*<\/div>#  pour les divs
     
    #<img [^>]*\/>#  pour les images et le liens <a>
    le probleme pour les div c'est que cela implique qu'il n'y ai
    pas d'ouverture d'une autre balise à l'interieur..
    dans <div><a href></a></div>
    on ne pourra pas recuperer le contenu de <div></div>

  4. #4
    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 : 50
    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
    Tu peux lire cette page : http://www.regular-expressions.info/repeat.html
    le paragraphe "Laziness Instead of Greediness" plus particulièrement

    J'ajouterais à cela qu'il y avait une autre réponse à ton problème, que je n'aime pas trop car plus spécifique à php : le modificateur U que tu peux rencontrer ici : http://g-rossolini.developpez.com/tu...=syntaxe#LII-7
    • 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

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut eheh
    eheh pas mal !

    j'avais trouvé directement la meilleur solution : utiliser le [^>]

    mais effectivement le mode + paresseux est tres interessant.

    Merci !

    je vais egalement jeter un oeil sur \U

  6. #6
    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 : 50
    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 maigre Voir le message
    eheh pas mal !

    j'avais trouvé directement la meilleur solution : utiliser le [^>]
    Hélas non, et tu en as toi-même expliqué les limites : si une balise est située entre les deux div, tu es bloqué.
    • 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

Discussions similaires

  1. Comment forcer cron a prendre en compte des modifs?
    Par jlassira dans le forum Administration système
    Réponses: 31
    Dernier message: 17/06/2016, 12h40
  2. comment définir le trajet le plus court ou l'idéal?
    Par clavier12AZQSWX dans le forum Général Python
    Réponses: 13
    Dernier message: 03/06/2012, 12h21
  3. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  4. [Struts]comment forcer un Forward ?
    Par njac dans le forum Struts 1
    Réponses: 4
    Dernier message: 13/10/2004, 15h02
  5. Réponses: 2
    Dernier message: 21/03/2004, 18h57

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