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 :

Extraire un texte de ses balises [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut Extraire un texte de ses balises
    Bonjour,

    J'ai un souci et j'ai l'impression que la réponse me tourne autours par ici.

    En gros voilà le problème : j'ai un texte multilingue balisé qui se présente comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [txt_fr]mon texte est en français[/txt_fr][txt_en]my taylor is rich[/txt_en]
    Pas de problème pour l'afficher mais je veux n'afficher que la partie entre les balises. Soit, pour une pages en français, n'afficher que le texte contenu entre [txt_fr] et [/txt_fr].

    Mais je rame.
    J'avoue avoir un peu de mal à appréhender les expressions régulières. J'ai trouvé deux sujets proches sur ce forum mais j'ai l'impression de louper quelquechose.

    http://www.developpez.net/forums/sho...d.php?t=556600 et http://www.developpez.net/forums/sho...d.php?t=581864

    Eusebe propose les expressions rationnelles mais là j'avoue que je ne rame plus : je suis en panne, accroché à l'ancre.

    J'ai regardé la FAQ et je suis dans la doc php mais ça ne m'aide qu'à moitié.

    Si quelqu'un a une solution ou une proposition j'en serais ravi.

    Par avance, merci.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Expressions rationnelles et régulières sont des synonymes. Ce que je proposais dans un autre sujet était de passer des regex POSIX aux regex PCRE plus puissantes

    Pour ton cas, est ce que dans ton texte multilingue il peut y avoir plusieurs fois la balise [txt_fr] ?

    Si tu ne l'as qu'une fois, tu peux simplement utiliser preg_match :
    http://php.net/preg_match

    l'expression correspondante pourrait être par exemple :
    "@\[$balise\](.*)\[/$balise\]@s", avec $balise une variable contenant la balise à extraire (txt_fr, txt_en, etc...).

    Explications :
    @ = permet de délimiter l'expression rationnelle, doit être un caractère qui n'apparait pas dans l'expression
    \[ = le caractère [ ayant une signification particulière dans les expressions rationnelles, on l'échappe avec un \
    $balise = le texte de ta balise
    (.*) : les parenthèses permettent de capturer des éléments. Le point est un caractère joker. l'étoile signifie que l'élément précédent peut être représenté de 0 à n fois. Donc on capture une chaîne composée d'un nombre indéterminé de caractères jokers...
    @s = fin de l'expression (retour du délimiteur ) et ajout du modificateur 's' qui permet de prendre les retours à la ligne en compte avec le joker . (par défaut, ils ne le sont pas)

    Tu peux retrouver ces infos dans le tuto http://g-rossolini.developpez.com/tu...ns-regulieres/

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Je vais essayer ça, merci pour ton aide et surtout pour les détails.

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Je rajouterai en plus le modificateur U sur l'expression régulière de Eusebe, qui la fait se comporter de manière non gourmande.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Ok, donc en faisant une espèce de fonction comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function tradonce($lang, $textepoly){
    	$balise = "txt_".$lang;
    	$monpattern = "@\[".$balise."\](.*)\[/".$balise."\]@s";
    	preg_match($monpattern, $textepoly, $matches);
    	echo $matches[1];
    }
     
    <?php tradonce("fr", "[txt_fr]mon texte est en français[/txt_fr][txt_en]my taylor is rich[/txt_en]") ?>
    J'ai bien le texte "mon texte est en français" qui s'affiche.

    Un modificateur, dis-tu ?
    Je regarde ça...

    U pour "Ungreedy", mon masque devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "@\[".$balise."\](.*)\[/".$balise."\]@sU"
    Mais je ne vois pas beaucoup de différence. Mes textes sont probablement trop petits pour s'en rendre compte.

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    En fait, ça ne ferait une différence que si tu avais plusieurs fois les balises dans le même message (d'où ma question dans le deuxième post).

    Le fait d'ajouter le modificateur U permet d'obtenir les chaînes de la plus petite taille possible.

    Si tu avais "[txt_fr]mon texte est en français[/txt_fr][txt_en]my english text[/txt_en][txt_fr]mon tailleur est riche[/txt_fr][txt_en]my taylor is rich[/txt_en]', sans U le résultat serait "mon texte est en français[/txt_fr][txt_en]my english text[/txt_en][txt_fr]mon tailleur est riche".

    L'utilisateur de U permet peut-être aussi une exécution plus rapide de l'expression, mais là c'est une hypothèse, je ne connais pas suffisamment les expressions régulières pour en être certain...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    D'accord, eh bien ça fonctionne, je vous remercie d'avoir clarifié les choses.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/02/2014, 09h30
  2. [RegEx] Extraire du texte d'une balise
    Par GouKen dans le forum Langage
    Réponses: 1
    Dernier message: 28/01/2008, 17h17
  3. Regexp: extraire du texte entre deux balises
    Par moook dans le forum Langage
    Réponses: 11
    Dernier message: 19/06/2007, 18h08
  4. [RegExp] Extraire le texte entre 2 balises
    Par d1g-2-d1g dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/02/2007, 19h15

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