|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Bonjour à tous !
Suite à la création d'un module de BBCode, je voulais permettre une prévisualisation avant envoi, donc en JS. J'aurais aimé éviter une requête Ajax pour faire passer le tout dans du PHP, donc au final, il me faut décoder mon BBCode en full JS... C'est là le soucis. Déjà, contrairement à preg_replace en PHP, le string.replace de JavaScript ne "boucle" pas. Ça explique les quelques problèmes que je vais énoncer là.. Voilà l'topo : Il y a deux style de balise BBCode qui me préoccupent actuellement. Le reste sera adaptable si j'arrive à regler ces deux problèmes. Le premier : balise de type (bold -> gras). Admettons la chaine suivante dans un textarea : Deux idées pour remplacer mes par des en JS : Code :
str = str.replace(/\[B\](.*)\[\/B\]/gi, '<b>$1</b>'); Autre idée : Code :
str = str.replace(/\[B\](([^[](?!\B]))*)\[\/B\]/gi, '<b>$1</b>'); Donc, si quelqu'un sait comment résoudre ce problème déjà Le second problème est un chouilla plus complexe. J'ai, dans mes BBCodes, la possibilité d'ajouter la balise : Côté décodage, cette balise sera en gros, remplacé par une balise PRE. L'inconvénient (ou l'avantage au choix) de cette balise PRE, c'est que les \n correspondent à des sauts de ligne, mais que les BR sont affichés tels quels. Partout ailleurs, les \n provenant du textarea doivent être remplacé par des BR. Donc le code ci-dessous : va bien me remplacer mes \n par des BR dans mon texte, mais aussi entre mes balises "code lang=php". J'aurai aimé éviter des remplacements du type "dans les balises code, je remplace tous les \n par une chaine de folie, idem pour les br, je remplace les \n partout dans la page, et je remet mes \n et mes br que j'avais modifiés dans les balises codes". Le but est de trouver LA regexp qui fera : "Remplacer tous les \n par des <br />, SAUF ceux entre les balises codes". Pour info, voilà comment la balise code est remplacé : Code :
str = str.replace(/\[code lang=([a-zA-Z0-9]+)\](.*?)\[\/code\]/gi, '<div class="code"><pre class="brush: $1">$2</pre></div>'); ![]() Si quelqu'un qui passe par là à une idée |
|
|
00
|
|
|
#2 | ||
![]() ![]() Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur Inscription : mars 2002 Messages : 30 018 ![]() |
elle ne te convient pas cette solution là ?
Code :
__________________
Ma page Developpez Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts) Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir... Votre post est résolu ? Alors n'oubliez pas le Tag ![]() ![]() réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr |
||
|
|
00
|
|
|
#3 | |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Ben non Spaffy, j'ai écris :
Citation:
Le but, réellement, c'est d'avoir une regExp bien propre quoi.. A défaut, j'me contenterai d'une solution temporaire comme ça, mais réellement, c'est pas le mieux. J'imagine qu'avec un nombre indéterminé de balise code, j'vais devoir m'amuser à boucler. ^^ Elle est si balaise que ça à construire cette regExp ? |
|
|
|
00
|
|
|
#4 |
![]() ![]() Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur Inscription : mars 2002 Messages : 30 018 ![]() |
ben c'est surtout au niveau des exclusions au sein des imbrication ..
pour la boucle c'est pas très compliqué ..
__________________
Ma page Developpez Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts) Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir... Votre post est résolu ? Alors n'oubliez pas le Tag ![]() ![]() réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr |
|
|
00
|
|
|
#5 | ||
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Provisoirement, j'ai fais la boucle ; j'essaie toujours de faire la regExp, mais waow, compliqué...
Avec ton script et la boucle : Code :
Code :
('/((?<!\[code\])\n(?!\[\/code\]))/mi', '<br />', $txt); |
||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Emilie LefolEn recherche d'emploi Inscription : février 2009 Messages : 411 ![]() |
Comme vu sur le chat, je pose le code trouvé en php qui t'a plu :p
Code php :
Te reste plus qu'a le passer en JS Mais en javascript, je trouve ceci dangereux, je te conseille plus l'ajax...
__________________
![]() - Si on criait sur la place publique les fautes de tout le monde, on ne pourrait plus fréquenter personne ! (Marcel Pagnol) - Technocrates, c’est les mecs que, quand tu leur poses une question, une fois qu’ils ont fini de répondre, tu comprends plus la question que t’as posée. (Coluche) |
||
|
|
10
|
|
|
#7 |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Merci Atomya de l'avoir mis =)
En JS dangereux ? C'est côté client, il fait ce qu'il veut, c'est qu'une preview... Je ne me sers pas de ce qu'il voit =) En Ajax par contre, ça part côté serveur |
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : mai 2011 Messages : 14 ![]() |
Tu veux que l'aperçu soit en temps réel ? Sinon un simple affichage après validation et donc traitement côté serveur suffit. C'est ce que j'avais fait pour mon module et ça fonctionnait parfaitement. Aucun intérêt à valider des deux côtés, client et serveur, dans le cas d'une prévisualisation juste avant l'envoi. C'est comme ça que l'éditeur qu'on utilise ici fonctionne d'ailleurs.
|
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Oui, le but c'était le temps réel, enfin surtout éviter le traitement côté serveur. Le but était de pomper uniquement sur le client, d'où le full JS. Sinon je suis d'accord avec toi, en toute simplicité, on fait la preview après envoi mais avant enregistrement, comme ici, en rechargeant la page.
Tout de même, je ne marque pas le sujet comme étant résolu, car si quelqu'un arrive à me sortir la bonne regExp, elle pourra me servir dans bien d'autres circonstances |
|
|
00
|
|
|
#10 | ||
|
Futur Membre du Club
![]() Inscription : mai 2011 Messages : 14 ![]() |
Citation:
Aussi n'oublie pas que le BBCode, et j'en sais quelque chose, c'est un peu "has been" depuis l'émergence des composants d'édition HTML WYSIWYG supportés par les différents navigateurs. Au final la leçon que j'avais retenu, et les utilisateurs aussi, c'est que ce pseudo-langage n'apporte aucun avantage et que des inconvénients. Est-ce plus simple d'écrire des crochets [] que des signes <> ? [b] ou <b> ça revient au même. Après c'est moins évident pour certaines balises un peu plus complexes comme celle de l'hyperlien mais bon… Voilà sans vouloir lancer un débat, juste une piste de réflexion qu'on peut poursuivre dans un autre sujet si besoin. Je veux éviter que les autres reproduisent la même erreur que moi même si j'admets que développer mon petit module a été très enrichissant. Mais ça l'aurait été tout autant en HTML et sans WYSIWYG évident, à la dure ! Citation:
Bon j'arrête là je suis une vraie piplette mais tout ça me rappelle de bons souvenirs et aussi un paquet de prises de tête |
||
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() danseur Inscription : août 2003 Messages : 2 667 ![]() |
Citation:
Dieu sait si je suis fan des regexp mais je ne les utilise presque jamais pour traiter ce qui au fond est du html, même si tu le déguises en bbcode; si tu travaillais directement sur du dom, tu n'aurais pas ces prises de tête; donc, vois si tu ne peux pas faire un premier enregistrement en db pour donner l'aperçu: pas grand chose à perdre et un gain de neurones évident; ça rejoint le fait d'utiliser des regexp pour gérer les dates... [ceci dit, je me suis bien pris la tête pour trouver une soluce à ton exposé, la semaine dernière
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire. |
|
|
|
00
|
|
|
#12 | |||
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Citation:
Là j'suis pas sûr de saisir.. Ici il est question de Preview uniquement, le traitement côté serveur est donc évitable (pas d'enregistrement ni rien), et niveau sécurité.. Le client agit sur lui même, donc j'vois pas trop le soucis. En passant par de l'Ajax comme dit plus haut, je suis d'accord. En passant par du pur JS, vraiment, je vois pas. Si ça, c'est dangereux, alors une animation doit l'être aussi Virer le côté "temps réel" et ajouter un bouton "preview" à la place, pourquoi pas. C'est plus light, et j'peux m'en contenter. Par contre, j'insiste sur le côté client uniquement, aucun intérêt de charger le serveur avec les fonctions de preview, il n'y a aucun enregistrement, donc autant que le client s'en charge. Concernant le WYSIWYG : très bonne remarque ! la réponse est simple : les éditeurs actuels ne conviennent pas pour diverses raisons que j'ai franchement la flemme d'aborder ici Et dév' le mien, j'y ai songer. Mais c'est sacrément galère que de s'adapter à tout navigateur. Et puis un WYSIWYG BBCode, fiou... ^^Citation:
En terme de sécurité aussi, je trouve ça étrange que tu ais peur du full JS mais que tu me dise de laisser un quidam écrire des balises qui seront interprétées directement ensuite Est-ce plus simple d'écrire [code lang=php] ou <div id="code"><pre class="brush: php"> ? Très simplement, les [] n'ont pas de sens en HTML, tandis que les <> oui, et c'est là tout le problème. Concernant les regExp, j'te met un gros +1 ![]() Pour y répondre, en 1er lieu il y a une grande part de curiosité. J'arrive pas à la faire, donc elle m'énerve, donc faut que je comprenne pourquoi Ensuite, ça n'est pas que de la compression. En PHP, on pourra utiliser le callback du preg_replace. Mais en JavaScript ? La manière de faire que SpaceFrog avait trouvé était intéressante, en alternative. Conserver en variable, traiter le reste, revenir dessus ensuite. M'enfin, quand on développe, on préfère toujours trouver LA ligne qui va effectuer l'action, que de faire tout un détour non ? Surtout qu'ici, il est question d'une seule balise. Imagine que je me retrouve avec un tas de balises diverses, je serais bien content de trouver la regExp qui fait cela. Pour ça que j'avais ajouté : Citation:
Si tu fais ta pipelette, moi aussi
|
|||
|
|
00
|
|
|
#13 | |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Citation:
[EDIT] |
|
|
|
00
|
|
|
#14 |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Bon, étant donné que la-dite regExp semble trop compliqué pour quiconque, j'ai finalement fait le WYSIWYG adapaté BBCode + balises type "code"...
J'en ai grave baver quand même, entre IE et ses P / BR, Google Chrome et ses DIV, etc. ![]() Mais le résultat est là, un WYSIWYG au rendu identique sur les nav' que j'ai pu tester (IE7 / IE8 / FF3.6 / GC), reste plus qu'à lui ajouter toutes les balises voulues et à lui faire passer une période de test, histoire de voir si rien d'autre ne ressort. Marrant quand même, d'ajouter ses propres balises sur un WYSIWYG. On voit qu'c'est pas fait pour ![]() C'est avec regret que je marquerai ce topic comme étant résolu ; d'un côté j'ai une solution qui me convient, de l'autre, je n'ai pas eu la réponse escomptée. Mais bon, c'est l'web, 36000 manière d'aboutir au même résultat ^^ Quand même, cette regExp, si y en a un qui me la trouve... J'lui paie une
|
|
|
00
|
|
|
#15 | |
|
Expert Confirmé
![]() danseur Inscription : août 2003 Messages : 2 667 ![]() |
Citation:
mais vouloir traiter en une fois une chaîne comme ça n'est pas rationnel (pour le coup...)
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire. |
|
|
|
00
|
|
|
#16 | |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
Citation:
![]() Ben si, c'est pratique, tout de même, avoir son résultat en une seule ligne. Si, c'est logique, tout de même, utiliser une regExp (sens global) pour ce pour quoi elle a été créer. Bon, fondé sur la raison, okay, j'y met un bémol, pour une seule raison : pourquoi chercher à faire de cette manière alors qu'il existe plus simple ailleurs Mais ça ne serait qu'une suite d'argumentation / contre-argumentation sans fin. Au passage, personne ne m'a répondu sur la "sécurité" mise en jeu ici S'il y a un risque, j'aimerais le connaître...
|
|
|
|
00
|
|
|
#17 |
![]() ![]() Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur Inscription : mars 2002 Messages : 30 018 ![]() |
Traiter en une fois est possible et pas prohibitif, mais avec deux regexp, il suffit de faire un traitement en callback dans le replace en utilisant la seconde regexp dans le callback.
Ce qui est nettement plus complexe, si toute fois c'est réalisable, est de vouloir traiter en une seule fois avec une seule regexp ...
__________________
Ma page Developpez Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts) Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir... Votre post est résolu ? Alors n'oubliez pas le Tag ![]() ![]() réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr |
|
|
00
|
|
|
#18 |
|
Expert Confirmé
![]() danseur Inscription : août 2003 Messages : 2 667 ![]() |
en fait, je parlais du sens propre de "regular" donc "rationnel";
__________________
On ne mord pas, on manifeste seulement notre tristesse face à des exposés de situations qui défient notre entendement binaire. |
|
|
00
|
|
|
#19 |
|
Futur Membre du Club
![]() Damien Inscription : juillet 2009 Messages : 50 ![]() |
ScapeFrog> Les RegExp existent dans plusieurs langages, et le Callback n'est pas toujours possible directement (JS ^^)
Sinon ouais, j'commence à douter que ce soit possible. Si j'arrive à choper julp, faudrait que j'lui pose la colle javatwister> Beh c'est quoi la différence ? [EDIT] 'tain le callback existe en JS
|
|
|
00
|
|
|
#20 | |
|
Membre Expert
![]() Matilin TorreÉtudiant Inscription : juin 2010 Messages : 679 ![]() |
Citation:
Pas au mien (d’avis) : je n'ai pas de preuves de ce que je raconte, mais je pense que tous les moteurs de regex héritent plus ou moins du premier, qui doit être celui de Perl, du moins pour la famille des PCRE (Perl-Compatible Regular Expressions). Donc rien à voir avec JavaScript, ça doit être implémenté en « code natif ». Cela dit, rien n'oblige une regex à être plus efficace qu'un bout de code JavaScript. Tout dépend si elle est bien construite… Le terme officiel c'est expression rationnelle en français. Pour ceux que ça intéresse, ça fait partie de la théorie des langages rationnels, niveau 2 de la classification de Chomsky (oui, celui du film). Avec les automates finis et les automates à pile, qui sont des trucs assez chouettes. On trouve pas mal de docs précises là-dessus en fouillant sur le Web C'est simplement que si quelqu'un (exemple au hasard : un développeur web) est capable de trafiquer les données juste avant que le navigateur les envoie au serveur, alors ton serveur reçoit des données qui n'ont pas forcément été contrôlées comme tu le désires… Donc il faut contrôler aussi côté serveur.
__________________
Disposition de clavier ergonomique française : Bépo |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com