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 :

Catcher 2 Liens successifs dans un source Markdown


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Catcher 2 Liens successifs dans un source Markdown
    Bonjour !

    Mon source est un fichier codé en markdown, avec (potentiellement) des liens sur différentes URL. Typiquement :
    $texte = "...blah... [libellé_1](http://www.site1.com) ...blah... [libellé_2](http://www.site2.com) ...blah..."

    Je veux catcher ces Liens les uns après les autres, dans une boucle.
    Donc au 1er passage, je cherche à matcher séparément le [libellé1] d'une part, le (lien site1) qui le suit d'autre part.

    Pour ce faire, j'utilise 2 preg_match :
    - pour le libellé : $int = preg_match ('/(\[.*\])/',$texte,$matches);
    - & pour le lien : $int = preg_match ('/(\(.*\))/',$texte,$matches);

    Sauf que chacune de ces expressions s'arrête sur la DERNIERE occurrence trouvée de "]" et de ")" et non sur la PREMIERE.
    J'obtiens donc :
    - pour le libellé : [libellé_1](http://www.site1.com) ...blah... [libellé_2]
    - & pour le lien : (http://www.site1.com) ...blah... [libellé_2](http://www.site2.com)

    ...au lieu d'obtenir :
    - pour le libellé : [libellé_1]
    - & pour le lien : (http://www.site1.com)

    Quelqu'un peut-il m'aider (....je suis NULL en expressions régulières... ) ?
    Merci !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    essayer de mettre le mode "non glouton" en rajoutant un U comme cela : '/(\[.*\])/U'
    regardez là pour plus d'informations sur les différents modes :
    http://php.net/manual/fr/reference.p....modifiers.php


    vous pouvez aussi tout récupérer en une seule fois comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("/\[(.*)\]\((.*)\)/U", $texte, $matches, PREG_SET_ORDER);

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Déjà, si ton but est de transformer du texte, il s'agit d'un remplacement. Donc tu n'utilises pas la bonne méthode (preg_match se contente de trouver une occurrence et c'est tout). Tu devrais plutôt te tourner vers preg_replace ou preg_replace_callback suivant le type de remplacement que tu as à faire (erreur de débutant à éviter: rechercher avec preg_match puis remplacer avec preg_replace ou preg_replace_callback ou encore avec str_replace, ces fonctions trouvent et replacent à la fois). Qui plus est, ces fonctions remplacent toutes les occurences d'un texte et pas seulement la première, donc en utilisant l'une d'elles tu pourras te passer de boucle.

    [EDIT] Oublie ce que j'ai écris au sujet du remplacement, j'avais lu "Je veux cacher ces Liens les uns après les autres..." au lieu de "Je veux catcher ces Liens les uns après les autres...".

    Maintenant au sujet du problème d'arrêt: comme l'as dit mathieu, les quantificateurs sont gourmands (greedy) par défaut, et tu peux les rendre non gourmands en ajoutant un point d'interrogation après. * (gourmand) *?(non gourmand).

    Ceci dit, un quantificateur non gourmand demande plus de travail au moteur de regex car à chaque caractère qu'il prend, il doit vérifier que le reste de l'expression régulière réussit, alors qu'un quantificateur gourmand prend tout ce qui est possible et se pose des questions après, quitte à devoir rendre des caractères pour que l'expression réussisse.

    Comme tu peux le comprendre, aucun des deux comportements n'est meilleur que l'autre: l'un teste d'entré de jeu en avançant lentement, et l'autre avance vite mais teste après coup et éventuellement recule.

    Une solution médiane consiste à profiter de la rapidité d'avancée du quantificateur gourmand tout en réduisant le nombre d'étapes de retour arrière et les tests qui en découlent. Pour ce faire la solution est très simple dans ton cas: il suffit d'interdire le caractère ] ou ) au lieu d'utiliser le point (qui représente n'importe quel caractère excepté \n). Pour ce faire, en lieu et place du point, il faut utiliser les classes de caractères en excluant le caractère voulu: [^]] ou [^)]. Ce qui donne: et:Pour faire des tests: regex101.com.
    Pour comprendre le comportements des quantificateurs (entre autres): Mastering regular expressions _ J Friedl _ O'Reilly
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Liens dans le source
    Par mga_geo dans le forum IGN API Géoportail
    Réponses: 1
    Dernier message: 27/07/2009, 10h05
  2. [débutante]Probleme de liens image dans JSP/Servlet
    Par celine31 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/11/2004, 15h51
  3. Réponses: 3
    Dernier message: 26/10/2004, 07h31
  4. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  5. lien hypertexte dans une anim flash
    Par vedder dans le forum Flash
    Réponses: 17
    Dernier message: 14/01/2004, 14h11

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