Parser BBCode

Parser BBCode - PHP - Programmation

Marsh Posté le 28-01-2005 à 14:47:36    

Nouvelle question plus loin
----------------------------------
 
Voilà en fait je trvail actuellement sur le développement d'un site communautaire essentiellement basé sur le théme de la programmation. Je suis chargé du développement du forum et tout marche à merveille sauf que j'ai un probléme:
 
Comme il est fort probable que les gens souhaitent diffuser des codes source sur ce forum, il faudrait que les espaces du début de chaque lignes soit pris en compte.
 
Je m'explique:
Quand on écrit du code tous le monde le sais on met des décalage pour les if, while, et companie. Et bien sur mon forums les messages sont affichés dans un tableau jusque la rien de bien spéciale. Mais losque je post un message dessus et que je met ces décalages dans le code et bien il ne sont pas pris en compte par le navigateur.
 
En gros ce qu'il me faudrait c'est que si une ligne commence par un espace celui ci soit remplacé par  
Mais je ne trouve rien de fonctionnel. J'ai bien essayé  
$texte = str_replace(" "," ",$texte); mais avec ca il n'y a pas de retour à la ligne...  
Enfin bon je sais pas si ma demande est bien claire mais si vous avez compris ou alors que vous avez des question, je vous en prie.


Message édité par dwogsi le 11-02-2005 à 14:57:10
Reply

Marsh Posté le 28-01-2005 à 14:47:36   

Reply

Marsh Posté le 28-01-2005 à 14:51:27    

Code :
  1. test    test


 
test    test


Message édité par antp le 28-01-2005 à 14:52:37

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-01-2005 à 14:53:34    

Ici le forum met des   mais ça fait un peu bidouillage quand même :D
Il me semble qu'il y avait moyen de le faire avec la propriété CSS "white-space" mais je ne sais plus si ça marchait dans IE [:figti]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-01-2005 à 15:00:50    

Avec le tag html <pre>ton code</pre> cela marchera très bien.

Reply

Marsh Posté le 28-01-2005 à 20:59:38    

Effectivement avec <pre> ca marche en ce qui concerne les espaces... Mais parcontre le format du texte devient: police par defaut. Et en plus de ca les retrour à la lignes sont doublés comme si mes <br> devenaient des <p></p>...
 
Alors je viens de tenter autre chose:
$texte = str_replace("\n ","\n&nbsp;",$texte);
Alors forcement le premier espace de la ligne est effectivement pris en compte mais pas les suivant.
 
Si je ne trouve rien je vais vraiment finir par mettre en place une solution bidouillage du genre la ligne commence par un point dont la couleur est la même que le fond du tableau. Mais bon je me dis qu'en cas de copier coller c'est pas top.
 
Et cette histoire de CSS "white-space" ca m'intéresse mais je ne peut pas dire que je suis bien callé en CSS...


Message édité par dwogsi le 28-01-2005 à 21:01:27
Reply

Marsh Posté le 28-01-2005 à 21:18:20    

En fait quand tu utilise la balise <pre> le navigateur va interpreter tous les charactes de facon "conventionnelle". C'est a dire que tous les espaces seront affiches, mais egalement les retours chariots. Donc du coup, si tu as deja fait un "nl2br" tu va effectivement te retrouver avec des lignes doubles (1 a cause du retour chariot et une autre a cause du <br> ).

Reply

Marsh Posté le 28-01-2005 à 22:50:17    

dwogsi a écrit :


Et cette histoire de CSS "white-space" ca m'intéresse mais je ne peut pas dire que je suis bien callé en CSS...


 
Renseignements pris, ça ne marche pas dans IE...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-01-2005 à 23:51:38    

si tu veux remplacer les espaces, utilise plutôt preg_replace
 

Code :
  1. $code = preg_replace("#^( *)#me", "str_repeat('&nbsp;', strlen('\\1'))", $code);


(non testé mais normalement c'est bon)


Message édité par soju le 31-01-2005 à 13:55:20
Reply

Marsh Posté le 29-01-2005 à 10:46:32    

Il ne faut pas remplacer tous les espaces, sinon une longue phrase ne sera plus coupée pour aller à la ligne.
Ce que je ferais c'est remplacer tous les doubles espaces par espace + nbsp tant que l'on trouve des doubles espaces.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 29-01-2005 à 11:05:51    

antp a écrit :

Il ne faut pas remplacer tous les espaces


relis bien ma regex et les options utilisées : elle ne remplace que les espaces de début de ligne.

Reply

Marsh Posté le 29-01-2005 à 11:05:51   

Reply

Marsh Posté le 29-01-2005 à 11:09:29    

Je comprends rien aux regexpr, donc je ne disais pas ça pour ton message mais juste comme ça pour info pour si certains n'y avaient pas pensé ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 29-01-2005 à 11:31:09    

antp a écrit :

Je comprends rien aux regexpr, donc je ne disais pas ça pour ton message


désolé, parlé trop vite  :jap:  

Reply

Marsh Posté le 31-01-2005 à 10:24:57    

$code = preg_replace("#^( *)#me", "str_repeat('&nbsp;', strlen('\\1'))", $code);
 
Et bien marche toujours pas
...
 
Je n'ai que le premier espace de la ligne qui est remplacé par &nbsp; donc les suivant ne sont toujours pas pris en compte par IE...
 
Bordel je vais jamais y arriver! Help! Pitié!!  :fou:

Reply

Marsh Posté le 31-01-2005 à 13:55:49    

Utilise <pre>

Reply

Marsh Posté le 31-01-2005 à 13:57:55    

Dwogsi a écrit :

Et bien marche toujours pas
...


bizarre, chez moi cela fonctionne avec tous les espaces de début de ligne.
 
exemple :  

Code :
  1. $code = <<<EOF
  2.    glop
  3.       glop
  4. EOF;
  5. echo preg_replace("#^( *)#me", "str_repeat('&nbsp;', strlen('\\1'))", $code);


résultat :

Code :
  1. &nbsp;&nbsp;&nbsp;glop
  2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glop


Reply

Marsh Posté le 31-01-2005 à 13:58:53    

Cerel a écrit :

Utilise <pre>


déjà conseillé mais le monsieur il veut pas...  ;)


Message édité par soju le 31-01-2005 à 13:59:53
Reply

Marsh Posté le 31-01-2005 à 14:50:11    

Si, il faut utiliser <pre>. Pour rétablir la police, suffit de la modifer dans le CSS. Aussi, y'a plus besoin de <br> et autres machins.
 
Aussi, les &nbsp; ne sont pas la bonne solution. Techniquement, les &nbsp; sont réservés pour marquer un espace insécable, donc les espaces par exemple entre un mot et un '!', ou avant un ':'. Ce sont des espaces destinés à la typographie, et non un outil pour remplir avec du blanc :)
 
Donc <pre> ou rien d'autre...

Reply

Marsh Posté le 31-01-2005 à 15:14:53    

Bon ben je plussoie FlorentG :jap: :)


Message édité par Dj YeLL le 31-01-2005 à 15:15:01
Reply

Marsh Posté le 31-01-2005 à 18:44:42    

Je dirais meme plus, pourquoi ne pas utiliser la balise <code> ??
http://www.w3.org/TR/html401/struc [...] #edef-CODE

Reply

Marsh Posté le 31-01-2005 à 19:58:55    

Ouaip :jap: <code> pour du code, et <pre> pour du texte préformatté.

Reply

Marsh Posté le 31-01-2005 à 23:57:38    

Bon alors je dois vous dire que je suis un veritable c**!
Toutes les solutions que vous me proposez fonctionnent à merveille c'est juste qu'un autre gars avait modifié la BDD et qu'il ne restait qu'un seul espace au début de la ligne..
 
Toutes mes excuses!

Reply

Marsh Posté le 31-01-2005 à 23:59:31    

arf :D aller, bon courage pour la suite :)

Reply

Marsh Posté le 01-02-2005 à 08:07:55    

Bon courage ;)
 
++

Reply

Marsh Posté le 11-02-2005 à 14:16:13    

Bon alors je sais je fais remonter un topic un peux vieux mais bon comme c'est toujours et encore sur le même sujet je me suis que je n'allais pas en recréer un autre.
 
Donc je suis toujours sur mon parser BBCode, je dois dire que je lutte alors j'ai fait avancer le reste de mon forum et voila j'y reviens.
 
Donc voilà ma question:
J'ai donc eut ma réponse à propos des espaces en début de ligne ca marche bien (merci). Enfin marchait bien. Je viens d'ajouter la fonction pour afficher du code sur le forum et les décalage du code ne sont pas affiché dans le nouveau tableau ainsi créé pour afficher le code.
 
Je vous laisse jeter un oueil à mon code (en version courte) :

Code :
  1. function bbCode($t)
  2. // remplace les balises BBCode par des balises HTML
  3. {
  4.    // Prise en compte des espaces au debut des lignes
  5.    $t = preg_replace("#^( *)#me", "str_repeat('&nbsp;', strlen('\\1'))", $t);
  6.    // Code
  7.    $t=str_replace("",'<b>Code:</b><table border="0" width="100%"
  8.       style="border: 1 solid #000000" bgcolor="#FFFFFF" cellspacing="2"
  9.       cellpadding="4"><tr><td width="100%"><font color=green>',$t);
  10.    $t=str_replace("",'<font></td></tr></table>',$t);
  11.    return $t;
  12. }


 
Bon je crois que mon principal problème c'est que je n'y comprend rien a ces pattern et les preg_replace et companie donc forcément ca me limite pour un parser BBCode. D'ailleur si quelqu'un sais ou je peux trouver un bon tutos au sujet des pattern, ereg_replace, preg[...] je suis preneur. Et pas les explications de php.net parceque j'ai tout appris avec ce site mais alors sur ce sujet je trouve que leur explications ne sont pas clair...
 
Ah oui et je précise en passant, puisqu'on va certainement me le dire, j'ai ajouté à ma fonction un autre petit bou de code qui empêche de ne mettre qu'un [code] et pas la balise fermantte:
 

Code :
  1. $n = substr_count($s, '<table') - substr_count($s, '</table>');
  2.         return $n >= 0 ? $s . str_repeat('</table>', $n) : str_repeat('<table>', -$n) . $s;


Message édité par dwogsi le 11-02-2005 à 14:22:55
Reply

Marsh Posté le 11-02-2005 à 14:42:53    

je te conseille de faire une méthode à part pour traiter le code, et de mettre dans cette méthode le remplacement des espaces de début de ligne, car là tu l'applique à tout ton texte. tu y verras plus claire en séparant les traitements.
 
sinon pour apprendre les regexp rien ne vaut la pratique ^^


Message édité par soju le 11-02-2005 à 14:43:33
Reply

Marsh Posté le 11-02-2005 à 14:51:13    

T'essaye de remplacer les espaces par des &nbsp; :??: Parce que c'est absolument invalide, ça ;)

Reply

Marsh Posté le 11-02-2005 à 14:52:28    

soju a écrit :

je te conseille de faire une méthode à part pour traiter le code, et de mettre dans cette méthode le remplacement des espaces de début de ligne, car là tu l'applique à tout ton texte. tu y verras plus claire en séparant les traitements.
 
sinon pour apprendre les regexp rien ne vaut la pratique ^^


 
Arf oui ca je veut bien apprendre par la pratique jusque la ca allait mais comme je le disais avec ce parser bah j'y arive pas avec la pratique et je voudrais pas y passer 10 ans non plus sur la conception de ce foutu forum lol.
 
Et franchement je connais bien le SQL j'ai fait les études pour, le php ya plus grand chose qui m'échappe mais quand je vois ca par exemple:
"#^( *)#me"
là je me dis "heuuu...." parceque ca ne veut pas dire grnad chose à mes yeux! Je ne crois pas que ca corresponde à des mot!
 
Je veux dire par la que str_replace c'est simple a comprendre string replace c'est de l'anglais et coté anglais ya pas de problème!


Message édité par dwogsi le 11-02-2005 à 14:53:00
Reply

Marsh Posté le 11-02-2005 à 14:52:39    

Reply

Marsh Posté le 11-02-2005 à 14:52:49    

FlorentG a écrit :

T'essaye de remplacer les espaces par des &nbsp; :??: Parce que c'est absolument invalide, ça ;)


lol, Dwogsi n'est tjrs pas d'accord pour utiliser la balise pre ou code apparemmment.

Reply

Marsh Posté le 11-02-2005 à 14:54:22    

soju a écrit :

lol, Dwogsi n'est tjrs pas d'accord pour utiliser la balise pre ou code apparemmment.


Ouais, là une belle balise code, c'est tout con :??: Genre tu prends n'importe quel article chez pompage.net, ils utilisent une balise <pre> avec un style tout mignon :)

Reply

Marsh Posté le 11-02-2005 à 14:55:36    

Oui je c'est que c'est absolument invalide, ça mais bon je choisi la solution de facilité.
 
Et c'est pas que je veux pas mais ca me donne des truc innimaginable! Des caractéres qui n'ont rien a faire ici et là....
 
Bon vous voyez pas ou je peux trouver un parser efficasse? J'AI FAIT DES RECHERCHES mais rien de concluant...
 
Je renomme le topic "Parser BBCode" a mon avis ca correspondra mieux à ma demande!


Message édité par dwogsi le 11-02-2005 à 14:56:48
Reply

Marsh Posté le 11-02-2005 à 14:56:23    

Dwogsi a écrit :

mais quand je vois ca par exemple:
"#^( *)#me"
là je me dis "heuuu...." parceque ca ne veut pas dire grnad chose à mes yeux! Je ne crois pas que ca corresponde à des mot!


tout est dans la doc :
# : delimiteur de masque
^ : debut
le m : pour l'option multiligne => ^correspond donc a chaque debut de ligne
...etc
 
mais comme dirait FlorentG, il ya des balises html ou propriétés css pour gérer ça.

Reply

Marsh Posté le 11-02-2005 à 14:56:51    

Dwogsi a écrit :

Oui je c'est que c'est absolument invalide, ça mais bon je choisi la solution de facilité.
 
Et c'est pas que je veux pas mais ca me donne des truc innimaginable! Des caractéres qui n'ont rien a faire ici et là....
 
Bon vous voyez pas ou je peux trouver un parser efficasse? J'AI FAIT DES RECHERCHES mais rien de concluant...

Oui, dans un <pre> faut pas qu'il y ai de tabulations ou de retour chariots en trop ;) Faut bien faire gaffe quand tu affiche le code résulant :)

Reply

Marsh Posté le 11-02-2005 à 14:58:02    

Dwogsi a écrit :

Bon vous voyez pas ou je peux trouver un parser efficasse? J'AI FAIT DES RECHERCHES mais rien de concluant...
Je renomme le topic "Parser BBCode" a mon avis ca correspondra mieux à ma demande!


regarde les sources de phpbb ou ipb, tu auras tout ce qu'il te faut, et tu n'auras pas à réinventer la roue ^^


Message édité par soju le 11-02-2005 à 14:59:44
Reply

Marsh Posté le 11-02-2005 à 14:58:39    

Phpbb?? Ah oui je me souviens avoir regarder leur script et fonctions, premiére passe, deuxième passe.... et mêmes quelques requêtes SQL dans le lots et dont je ne vois pasq l'utilité et si je les supprimer 25 erreurs arrivent...
 
Tentative de modif, +25 erreurs!
Tentative d'adaptation +25 erreur!
 
Bon je vais encore galérer quelques jours et je vois ce que ca donnera...
 
Add/Edit:
Alors la c'est le grand miracle de ma vie! Je viens de trouver un tuto sur le sujet, assez clair pour que je comprenne.
http://www.asp-php.net/tutorial/asp-php/regexp.php
 
Je me suis di que ca pouvait intéresser certaines personnes qui, comme moi, ont du mal a comprendre ca par elle même.
 
Bon voilà avec ca je devrai m'en sortir merci à tous et si j'arrive à créer un paser BBCode opérationnel je le met sur le net au moins yen aura un!


Message édité par dwogsi le 11-02-2005 à 15:24:22
Reply

Marsh Posté le 13-02-2005 à 04:16:27    

Bon alors voilà je viens de nouveau quérir votre aide!
J'y suis enfin arrivé pour ma fonction pour le code, la voici:
 

Code :
  1. <?
  2. $t = preg_replace("#\[code\](.*?)\[\/code\]#s",'<pre>\\1</pre>',$t);
  3. ?>


 
Bon là c'est une version courte pour que ca rentre dans la page.
 
Alors biensur pour que les retours à la ligne de mon forum soit affiché je fais un nl2br($t); mais voilà que j'ai un second problème: comment supprimer les retours à la ligne qui se trouvent entre [code] et [ /code] ?
 
Je suis désolé de vous dérenger encore mais bon je viens de prendre environ 5h à arriver a comprendre les expressions régulières, et comme vous pouvez le voir je post à 4h18 et la vraiment je sature sur la recherche de solutions.


Message édité par dwogsi le 13-02-2005 à 04:52:18
Reply

Marsh Posté le 13-02-2005 à 11:08:40    

Euh, je n'ai peut être pas bien compris la question mais ... si tu retires les retours à la ligne qui sont entre tes balises [code ] ... ça risque de faire un code bizarre non ?


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-02-2005 à 15:35:22    

Bah j'ai deux choix, soit je met des retours à la lignes sur le reste du texte uniquement ou alors je supprime les retours à la lignes qui sont entre les balises [code] mais dans les deux cas je ne vois pas bien comment faire....
 
Bon je vous montre ce que ca donne comme résultat mon code:
http://www.softsharing.net/main/?o [...] topic=1258


Message édité par dwogsi le 13-02-2005 à 15:41:38
Reply

Marsh Posté le 13-02-2005 à 15:57:52    

L'affichage que tu as est "normal".
En effet tu utilises la balise <pre>, mais tu as egalement utilise nl2br, donc du coup tu te retrouves avec 2 sauts de ligne au lieu d'un.
 
Alors je te conseille d'utilise <code> (ou <pre> ), mais tu laisse tomber ton nl2br.

Reply

Marsh Posté le 13-02-2005 à 16:06:23    

ok je veux bien laisser tomber nl2br mais je fais comment pour mettre des <br> sur le reste du texte? Je suppose que ca doit être faisable avec un preg_replce() mais avec quelle expression réguliére? parceque la franchement je vois pas...


Message édité par dwogsi le 13-02-2005 à 16:06:48
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed