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 ; } } ?>
Partager