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 :

[Système] Plus petit résultat d'un expression rationnelle


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut [Système] Plus petit résultat d'un expression rationnelle
    Bonjour,

    J'ai un texte avec des balises de formatage spécial qui devrait être transformée en xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mon texte en %g*gras*% et un une taille de %s=18pt*18pt*%.
    Un texte en %i*italique*% et un en %ig*gras et itatlique*%.
    Voici un %l=http://www.debian.org/*lien vers debian*%
    J'ai donc fait un expression rationnelle qui me sort toutes ces balises et leur contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("/%[a-z]+(=.*)?\*.*\*%/U", $text, $result)
    Cette expression fonctionne très bien, sauf dans le cas de balise imbriquée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Un texte en %c=30pt*%i*de 30pt et italique*%*%
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Un texte en %c=30pt* %i*de 30pt et italique*% *%
    Ce que j'ai pensé faire, c'est d'abord prendre tous les couples de balises intérieures et répéter ça jusqu'aux balises extérieures avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(preg_match_all("/%[a-z]+(=.*)?\*.*\*%/U", $text, $result))
    {
        /* Code */
    }
    Mais ce code va me trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %c=30pt* %i*de 30pt et italique*%
    Alors que j'aimerais trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %i*de 30pt et italique*%
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %c=30pt*<span style="font-style: italic;">de 30pt et italique</span> *%
    Merci de votre aide.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par Tchetch
    Ce que j'ai pensé faire, c'est d'abord prendre tous les couples de balises intérieures et répéter ça jusqu'aux balises extérieures avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(preg_match_all("/%[a-z]+(=.*)?\*.*\*%/U", $text, $result))
    {
        /* Code */
    }
    L'idée est bonne, mais si tu veux faire ca, il faut que tu spécifie [^%] au lieu des "." dans ton expression réguliere pour etre sur de "rester" dans la meme balise.

    *** Note technique sur le sujet ;o) ***
    Sinon, j'ai fait un systeme de bbcode *from scratch* y a pas longtemps non plus, et je suis assez content du systeme que j'ai trouvé, qui evite d'avoir a relancer preg_match_all X fois si on a X balises imbriquées... j'ai pas le code sous les yeux, mais en gros j'utilise preg_match_all pour capturer uniquement les balises de debut et de fin (dans ton cas ca correspond a "%[^*]+*" pour une balise de debut et "*%" pour une balise de fin) avec l'option PREG_OFFSET_CAPTURE de preg_match_all. Cela me permet ensuite de faire une boucle *en un seul passage* sur toutes les balises et d'acceder rapidement a leur emplacement dans la chaine grace a l'offset capturé. Apres faut jouer un moment avec les offset dans les chaines pour faire des remplacements corrects, et eventuellement gerer une liste de remplacement a posteriori apres l'execution de la boucle, mais ca evite d'appeller X fois preg_match_all. Pour info il me semble que phpbb a un systeme en 2 passes... j'ai pas fait de benchmark entre les différentes solutions, mais ca serait interessant ;o)
    *** Fin de la note technique ***

  3. #3
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par Fladnag
    L'idée est bonne, mais si tu veux faire ca, il faut que tu spécifie [^%] au lieu des "." dans ton expression réguliere pour etre sur de "rester" dans la meme balise.
    Malheureusement pour la balise je ne peux pas interdire l'utilisation du % dans le texte. Si par exemple je veux mettre ce texte là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.google.ch/search?hl=fr&q=debian+%2B+apt&btnG=Rechercher&meta=
    Il faut donc que j'arrive à interdire /%[a-z]+(=.*)?\*/ dans le texte ... Mais je n'arrive pas à le faire ...

    Sinon j'ai pensé à utiliser les offsets, mais ça reste plus simple de faire une expression régulière. Sinon j'ai aussi pensé à utiliser preg_split ...

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

Discussions similaires

  1. [RegEx] Expression rationnelle : masque détecté 2 fois au plus
    Par superviny dans le forum Langage
    Réponses: 4
    Dernier message: 27/01/2014, 17h16
  2. Réponses: 2
    Dernier message: 15/12/2013, 10h24
  3. [langage] Expressions rationnelles (perl/C)
    Par ma2th dans le forum Langage
    Réponses: 11
    Dernier message: 02/08/2004, 18h07
  4. [CR8.5] le plus petit numéro de commande
    Par Damien69 dans le forum Formules
    Réponses: 3
    Dernier message: 26/05/2004, 10h35
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

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