Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1149 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Parser BBCode

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Parser BBCode

n°964698
dwogsi
Défaillance cérébrale...
Posté le 28-01-2005 à 14:47:36  profilanswer
 

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
mood
Publicité
Posté le 28-01-2005 à 14:47:36  profilanswer
 

n°964703
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-01-2005 à 14:51:27  profilanswer
 

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
n°964707
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-01-2005 à 14:53:34  profilanswer
 

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
n°964713
soju
One shot !
Posté le 28-01-2005 à 15:00:50  profilanswer
 

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

n°964993
dwogsi
Défaillance cérébrale...
Posté le 28-01-2005 à 20:59:38  profilanswer
 

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
n°965005
cerel
Posté le 28-01-2005 à 21:18:20  profilanswer
 

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> ).

n°965091
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-01-2005 à 22:50:17  profilanswer
 

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
n°965182
soju
One shot !
Posté le 28-01-2005 à 23:51:38  profilanswer
 

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
n°965307
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-01-2005 à 10:46:32  profilanswer
 

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
n°965311
soju
One shot !
Posté le 29-01-2005 à 11:05:51  profilanswer
 

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.

mood
Publicité
Posté le 29-01-2005 à 11:05:51  profilanswer
 

n°965315
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-01-2005 à 11:09:29  profilanswer
 

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
n°965323
soju
One shot !
Posté le 29-01-2005 à 11:31:09  profilanswer
 

antp a écrit :

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


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

n°966537
dwogsi
Défaillance cérébrale...
Posté le 31-01-2005 à 10:24:57  profilanswer
 

$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:

n°966708
cerel
Posté le 31-01-2005 à 13:55:49  profilanswer
 

Utilise <pre>

n°966710
soju
One shot !
Posté le 31-01-2005 à 13:57:55  profilanswer
 

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


n°966713
soju
One shot !
Posté le 31-01-2005 à 13:58:53  profilanswer
 

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
n°966800
FlorentG
Posté le 31-01-2005 à 14:50:11  profilanswer
 

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...

n°966845
Dj YeLL
$question = $to_be || !$to_be;
Posté le 31-01-2005 à 15:14:53  profilanswer
 

Bon ben je plussoie FlorentG :jap: :)


Message édité par Dj YeLL le 31-01-2005 à 15:15:01
n°967173
cerel
Posté le 31-01-2005 à 18:44:42  profilanswer
 

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

n°967245
FlorentG
Posté le 31-01-2005 à 19:58:55  profilanswer
 

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

n°967725
dwogsi
Défaillance cérébrale...
Posté le 31-01-2005 à 23:57:38  profilanswer
 

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!

n°967733
FlorentG
Posté le 31-01-2005 à 23:59:31  profilanswer
 

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

n°967894
Dj YeLL
$question = $to_be || !$to_be;
Posté le 01-02-2005 à 08:07:55  profilanswer
 

Bon courage ;)
 
++

n°978673
dwogsi
Défaillance cérébrale...
Posté le 11-02-2005 à 14:16:13  profilanswer
 

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
n°978717
soju
One shot !
Posté le 11-02-2005 à 14:42:53  profilanswer
 

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
n°978728
FlorentG
Posté le 11-02-2005 à 14:51:13  profilanswer
 

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

n°978731
dwogsi
Défaillance cérébrale...
Posté le 11-02-2005 à 14:52:28  profilanswer
 

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
n°978733
FlorentG
Posté le 11-02-2005 à 14:52:39  profilanswer
 
n°978735
soju
One shot !
Posté le 11-02-2005 à 14:52:49  profilanswer
 

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.

n°978738
FlorentG
Posté le 11-02-2005 à 14:54:22  profilanswer
 

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 :)

n°978739
dwogsi
Défaillance cérébrale...
Posté le 11-02-2005 à 14:55:36  profilanswer
 

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
n°978740
soju
One shot !
Posté le 11-02-2005 à 14:56:23  profilanswer
 

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.

n°978741
FlorentG
Posté le 11-02-2005 à 14:56:51  profilanswer
 

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 :)

n°978744
soju
One shot !
Posté le 11-02-2005 à 14:58:02  profilanswer
 

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
n°978746
dwogsi
Défaillance cérébrale...
Posté le 11-02-2005 à 14:58:39  profilanswer
 

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
n°979772
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 04:16:27  profilanswer
 

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
n°979802
Dj YeLL
$question = $to_be || !$to_be;
Posté le 13-02-2005 à 11:08:40  profilanswer
 

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
n°980043
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 15:35:22  profilanswer
 

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
n°980070
cerel
Posté le 13-02-2005 à 15:57:52  profilanswer
 

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.

n°980075
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 16:06:23  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Parser BBCode

 

Sujets relatifs
[JavaCC]Problème pour créer un mini-parser pour prog de mathParser
Parser un string (Date)Besoin d'aide pour parser CDATA avec jdom
Besion d'aide pour un parser.Parser (Yapp/Yacc): substitution de variables ?
[C#/ASP.NET] Peut on parser un formulaire situé dans un .doc?[XML] parser un formulaire en .doc ??
bbcodeParser xml allociné
Plus de sujets relatifs à : Parser BBCode


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR