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 :

Analyser un texte


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Analyser un texte
    Bonjour,

    Je viens d'arriver au bout d'un autre problème sur ces forums, mais j'en pose directement un autre he oui... désolé!

    Je réalise un système d'articles. C'est en fait plus ou moins la même chose qu'un wiki sur db. Je stock des textes dans ma bdd, j'organise ces textes en articles, et je met les textes en forme pour les afficher au lecteur.

    Lorsque l'éditeur va écrire les texte, il aura à disposition une certaine syntaxe pour mettre en page le texte. Bien sur, il y a un certain nombre de syntaxes semblable à du "bbcode"", comme sur ce forum pour les opérations les plus banales (mettre en gras, souligné, italiques, couleur, liens, images etc...)... Ce type de syntaxe est analysé et remplacé par du code html grace à des fonctions Expreg (preg_replace).

    Le problème, c'est que je cherche à faire certaine opérations qui (selon moi) sont impossible à réaliser avec de simples fonctions php sur les expressions régulières.

    Par exemple, une certaine syntaxe permet à mon éditeur de créer des titres H (H1 à H6)... Il est tout à fait possible de remplacer ces blocs par les balises html correspondantes grâce à preg_replace, mais je cherche en plus, à créer un sommaire de l'article.

    Je ne connais pas de fonctions qui me permette (par exemple) de récupérer dans un tableau, toutes les valeurs satisfassent une expression. Donc pour moi, je suis obligé d'exploser mon texte, de le parcourir, et de le réexploser en plus petites parties et encore le parcourir... (je mets un exemple en bas de page)

    C'est assez fastidieux et dieu sait les ressources que je gaspille.

    La question que j'ai, c'est de savoir s'il existe une telle fonction (question posés 2 parag plus haut)...? et si lorsqu'on essaie d'arriver à un tel résultat, il y a une meilleure manière?

    J'appelle ça un parser (par simple déduction de l'anglais) mais je ne suis pas certain non plus de mon terme...

    Merci d'avance! Bonne journée!

    Ah... le code exemple... Voici comment je gère mes notes de bas de page. Je veux que chaque fois que le texte rencontre ((Un texte xyz)) il sauvegarde la valeur entre double parenthèse dans un tableau, et remplace tout ce bazar par un numéro incrémenté à chaque rencontre de l'expression. En fin d'article, je reparcourerai le tableau de notes, et référerai chaque valeur avec un chiffre incrémentant depuis 1...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
    		//FORMATAGE DES NOTES DE BAS DE PAGE
    		//-----------------------------------
    		//initier un tableau qui va recevoir mes fragments de textes
    		$t_texte = array();
    		//D'abord exploser le texte avec les )), fins de note
    		$t_texte_1 = explode('))', $contenu) ;
     
    		//parcourir ce premier tableau
    		foreach($t_texte_1 as $el)
    		{
    			//exploser chaque élément entre les ((, débuts de notes
    			//je me retrouve pour chaque itértion de la boucle 1, avec deux éléments s'il existe effectivement un (( dans le texte
    			//S il n en existe pas, je n'en ai qu'un
    			//le premier element sera en position [0] de $t_texte_2
    			//le second, s'il existe est celui qui nous intéresse, puisque c'est celui qui contiendra les fragments de texte correspondants aux footnotes
    			//A noter que si j'avais commencé par splitter mes chaines (premier explode) avec les parenthèses ouvrante, le résultat aurait été différent, et erroné 
    			//(explode retourne tout le texte si il ne trouve pas le pattern)
    			$t_texte_2 = explode('((', $el) ;
     
    			//initiation d'un compteur et parcours du second tableau (possédant 1 ou 2 éléments
    			//un for aurait été plus logique
    			$i=0;
    			foreach($t_texte_2 as $el_2)
    			{
    				//miracle, si i vaut 1 (seconde itération de la boucle)...
    				//... c'est que l'élément [1] du tableau existe et qu'il correspond donc au footnotes et pas au texte qui l'entourre
    				//je stocke de toutes façon le fragment dans le tableau prévu en début de bloc, mais dans le cas ou i vaut 1, je marque le string par un ~ arbitraire
    				if($i == 1)
    					$t_texte[] = '~'.$el_2 ;
    				else
    					$t_texte[] = $el_2 ;
    				$i++;
    			}
    		}
     
    		//j 'initie un réceptacle pour la sortie texte de tout ce bazarre
    		$c = '' ;
    		//je parcours mon nouveau tableau
    		foreach($t_texte as $element)
    		{
    			//si le string commence par ~, c'est un footnotes...
    			//je le sauve dans une var globale de mon objet Article
    			//et je concatène $c avec le numéro, qui est égal à la longueur du tableau global
    			if(substr($element, 0, 1) == '~')
    			{
    				$this->ary_footnotes[] = substr($element, 1) ;
    				$j = count($this->ary_footnotes) ;
    				$c .= '<sup><a href="#footnotes" class="footnotes_exp">' .$j. '</a></sup>';
    			}
    			//sinon, je concatène simplement l'élément pour retrouver le texte de base
    			else
    			{
    				$c .= $element ;
    			}
    		}
     
    ?>

  2. #2
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser des produits qui existent déjà ?

    Connais tu FCKEditor ou TinyMCE ?
    Tu peux utiliser des feuilles de styles avec ces éditeurs.

    Le rédacteur pourra facilement mettre en forme en quelques clics de souris, et toi tu as gagné des heures de casse-tête.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Oui bien sur... Je connais FCK editor et je l'ai déjà vu à l'action une fois...

    Mais ce n'est pas seulement une question de résultat. Le but de ce petit projet est justement de le réaliser moi même, et de comprendre comment les modules tels que FCKE fonctionnent.

    Je ne suis pas professionnel dans la programmation web et ce projet est en fait destiné à être un outil pour mes collègues étudiants en médecine. En réalité, il s'agit d'un moyen d'écrire des résumés, puis de les partager entre étudiants. Pour ça je dois pouvoir faire en sorte que ma petite applic mettent en forme les instructions les plus courantes (gras, italiques, soulignés, notes de bas de pages etc)... Tout ce qu'un FCKE ferait donc, mais aussi des choses un peu plus spécifiques, comme des schémas d'un format particulier, ressemblant un peu à une organisations de classes en UML... Et ça je ne crois pas que FCKE s'en charge...

    De toutes façon, l'idée est de savoir comment ça marche...

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Citation Envoyé par fredu Voir le message
    Je ne connais pas de fonctions qui me permette (par exemple) de récupérer dans un tableau, toutes les valeurs satisfassent une expression. Donc pour moi, je suis obligé d'exploser mon texte, de le parcourir, et de le réexploser en plus petites parties et encore le parcourir... (je mets un exemple en bas de page)
    la fonction http://php.net/preg_match_all permet de faire ça, tu peux récupérer tous les résultats dans le 3e argument "$matches"

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    la fonction http://php.net/preg_match_all permet de faire ça, tu peux récupérer tous les résultats dans le 3e argument "$matches"
    génial! allez hop! à la doc!

    Sinon, quelqu'un a t il la réponse au sujet de la technique à utiliser pour analyser un texte et le découper en différentes instructions? Je voudrais simplement savoir si ma technique est correcte ou logique... et sinon, s'il y a de la doc à ce sujet...

    merci encore!


    EDIT:

    est ce qu'un traittement avec preg_match sur un motif #expression#isU, revient au même qu'un traitement avec preg_match_all sur un motif #espression#?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Citation Envoyé par fredu Voir le message
    Sinon, quelqu'un a t il la réponse au sujet de la technique à utiliser pour analyser un texte et le découper en différentes instructions? Je voudrais simplement savoir si ma technique est correcte ou logique... et sinon, s'il y a de la doc à ce sujet...
    en utilisant des expressions régulières, le code sera plus petit donc si tu arrives à avoir le résultat souhaité avec expressions régulières, il vaut mieux privilégier le code qui sera plus simple à maintenir

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    tu veux dire... en faisant quelque chose comme ça pour mes notes de bas de page

    (je cherche un motif [[valeur]])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    	preg_match_all('#\[\[(.+)\]\]#sU', $texte, $matches);
     
    	$i = 1;
    	foreach($matches[0] as $value)
    	{
    		$texte = str_replace($value, $i, $texte);
    		$i++;
    	}
    ?>
    ?

    Les expressions régulière passent par un moteur me semble-t-il assez gourmand. Je me trompe?

Discussions similaires

  1. [RegEx] Analyser du texte non XML
    Par CyrilleB dans le forum Langage
    Réponses: 1
    Dernier message: 10/08/2010, 00h55
  2. Analyser du texte
    Par yooyoo dans le forum Langage
    Réponses: 73
    Dernier message: 20/03/2010, 18h08
  3. Analyse de texte sur le site DELL
    Par VooDooNet dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2010, 18h08
  4. Analyse du texte de puis outlook
    Par ilcocodrillo dans le forum VBA Word
    Réponses: 0
    Dernier message: 09/11/2007, 16h02
  5. [RegEx] Analyser un texte
    Par knoll dans le forum Langage
    Réponses: 4
    Dernier message: 21/03/2007, 17h47

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