Question

Je voudrais travailler sur un filtre bbcode pour un site web php. (J'utilise cakephp, ce serait un assistant bbcode) J'ai des exigences.

Les Bbcodes peuvent être imbriqués. Donc, quelque chose comme ça est valide.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Les Bbcodes peuvent avoir 0 paramètre ou plus.

Exemple:

[video: url="url", width="500", height="500"]Title[/video]

Les codes Bb peuvent avoir plusieurs comportements.

Disons que, [url]text[/url] serait transformé en [url:url="text"]text[/url] ou la vidéo bbcode serait en mesure de choisir entre youtube, dailymotion ....

Je pense que cela couvre la plupart de mes besoins. J'ai déjà fait quelque chose avec regex. Mais mon plus gros problème était de faire correspondre les paramètres. En fait, j'ai imbriqué bbcode au travail et bbcode avec 0 paramètres. Mais lorsque j'ai ajouté une correspondance regex pour les paramètres, elle ne correspond pas correctement à bbcode imbriqué.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // Ce n'était pas le cas. * mais le matcher non-gready

Je n'ai pas la regex complète avec moi pour le moment, mais j'avais quelque chose qui ressemblait à ça (ci-dessus).

Existe-t-il un moyen de faire correspondre efficacement bbcode à regex ou à autre chose? La seule chose à laquelle je peux penser est d'utiliser le modèle de visiteur et de scinder mon texte avec chaque balise possible de cette façon, je peux avoir un peu plus de contrôle sur mon analyse de texte et je pourrais probablement valider mon document si le texte saisi ne Vous n'avez pas de code bb valide. Je pourrais prévenir l’utilisateur en cas d’erreur avant de sauvegarder quoi que ce soit.

J'utiliserais sablecc pour créer mon analyseur de texte. http://sablecc.org/

Une meilleure idée? ou tout ce qui pourrait conduire à un analyseur bbcode flexible et efficace?

Merci et désolé pour mon mauvais anglais ...

Était-ce utile?

La solution

Il existe à la fois un pecl et un PEAR , bibliothèque d'analyse syntaxique BBCode. Le logiciel est déjà assez difficile sans réinventer des années de travail par vous-même.

Si aucune de ces options n'est envisageable, je me concentrerai sur la conversion du BBCode en une chaîne XML valide, puis sur l'utilisation de votre routine d'analyse XML préférée. Très très approximative idée ici, mais

  1. Exécutez le code via htmlspecialchars pour échapper à toutes les entités nécessitant une échappement

  2. Transformez tous les caractères [et] en < et > respectivement

  3. N'oubliez pas de prendre en compte les deux points dans des cas tels que [tagname:

Si le BBCode a été imbriqué correctement, vous devez être prêt à transmettre cette chaîne à un objet d'analyse syntaxique XML (SimpleXML, DOMDocument, etc.)

Autres conseils

Il existe plusieurs bibliothèques pour analyser le BBCode, il est peut-être plus facile de s'y intéresser que d'essayer de créer votre propre:

En voici quelques-uns, je suis sûr qu'il y en a plus si vous regardez autour de vous:
bbcode PECL
PEAR HTML_BBCodeParser

Je me suis intéressé aux analyseurs syntaxiques de bbcode. La plupart d'entre eux utilisent regex et PHP4 et produisent des erreurs sur PHP 5.2+ ou ne fonctionnent pas du tout. PECL bbcode et PEAR HTML_BBCodeParser ne semblent plus être maintenus (fin 2012) et ne sont pas facilement installés sur la configuration d'hébergement partagé avec laquelle je dois travailler. StringParser_BBCode fonctionne avec quelques modifications mineures pour 5.2+, mais la méthode utilisée pour l'ajout de nouveaux tags est maladroit et sa dernière mise à jour remonte à 2008.

Enfoui sur la 4ème page d'une recherche sur Bing (je devenais désespéré), j'ai trouvé jBBCode , qui apparaît comme nouveau. et nécessite PHP 5.3. MIT Lisence. Je n'ai pas encore essayé de créer des balises personnalisées, mais c'est pour l'instant le seul que j'ai essayé qui fonctionne immédiatement avec un compte d'hébergement partagé avec PHP 5.3.

  

En réponse à: & "Une meilleure idée? &"; (et je suppose que ceci était une invitation et pas seulement pour une amélioration par rapport aux suggestions spécifiques à bbcode)

Nous avons récemment envisagé de suivre la route bbcode et décidé d'utiliser à la place htmlpurifier . Cette décision est basée en partie sur les comparaisons (certes probablement biaisées) entre les différentes méthodes répertoriées par le groupe htmlpurifier ici et la discussion sur bbcode (à nouveau, par le groupe htmlpurifer) ici

Et pour mémoire, je pense que votre anglais était très bon. Je suis sûr que c'est beaucoup mieux que ce que je pourrais faire dans votre langue maternelle.

Utilisez preg_split() avec PREG_DELIM_CAPTURE l'indicateur pour scinder le code source en balises et en non-balises. Ensuite, parcourez les balises en conservant la pile de blocs ouverts (c'est-à-dire lorsque vous voyez une balise d'ouverture, ajoutez-la à un tableau. Lorsque vous voyez une balise de fermeture, supprimez les éléments de la fin du tableau jusqu'à ce que la balise de fermeture corresponde à la balise d'ouverture.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top