Supposons que ton message contienne juste ça :
[url=https://twitter.com/Gozilu/status/698160541915811840]
[url=https://twitter.com/Gozilu/status/698160541915811840]
Voilà les étapes par lesquelles passe le parseur :
- Au caractère 0 de la 1ere ligne il y a une balise
[url=truc] qui semble valide => elle est conservée
- Au caractère 5 de la 1ere ligne il y a une URL seule qui aurait pu être valide, mais elle est en conflit avec la balise
[url=truc] qu'on a vu juste avant et qui a donc la priorité => elle est ignorée
- Au caractère 0 de la deuxième ligne il y a une autre balise
[url=truc], mais on est déjà à l'intérieur d'une autre balise
[url=truc] et cette balise n'accepte pas l'imbrication => elle est ignorée
- Au caractère 5 de la deuxième ligne il y a une URL seule, et cette fois elle n'est pas en conflit avec la balise
[url=truc] qui l'entoure puisqu'on vient de l'ignorer => elle est conservée
- À la fin on a jamais trouvé la balise
[/url] qui doit fermer la toute première balise
[url=truc] rencontrée => elle est jetée
Du coup au final la seule transformation qui est effectuée est celle de la deuxième URL, en rouge dans l'exemple.
Pour compliquer encore les choses, c'est une version tokenisée des messages qui est sauvegardée en base. Elle est beaucoup plus rapide à interpréter et elle prend moins d'espace, mais elle perd aussi beaucoup d'informations. Quand on édite le message il faut le remettre sous sa forme bbcode, et le parseur ajoute des \ partout où il trouve des balises qui ont l'air valides mais qui pour une raison n'ont pas été transformée (ces \ assurent qu'elles ne seront toujours pas transformée si on valide l'édition). Cette dernière partie est pleine de cas tordus et contient encore des bugs, mais je pense qu'il faudrait que j'en réécrive une bonne partie pour les corriger donc je ne m'y suis toujours pas attaqué.