Oo, ok là faut que tu m'explique parce que j'ai rien compris
Le simple fait d'enlever les espace devant les parenthèses joue sur le fonctionnement de la regex?
Oui, un espace est un caractère actif participant à la définition du masque, comme presque tous les caractères (sauf ceux ayant une signification spéciale dans la syntaxe pcre, et il y en a pas mal, il est vrai

).
En supprimant l'espace de la partie "en dur" de la regexp tu as laissé le .* englober l'espace de manière optionnelle, ce qui du coup valide les deux formes de balise =D> C'est ce que j'avais tenté de t'expliquer avant.
Tu n'es donc pas obligé de tout gérer au caractère près dans une regexp. En fait, dans un souci de performance, il vaut mieux faire au plus court (mais quand même en écrivant les règles nécessaires pour que tout fonctionne bien)
J'ai trois citations complex et une simples, et ça fonctionne Oo
if(preg_match('@<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide
EDIT: j'ai rien dit, j'ai oublier qu'on était dans la regex, et que de se fait l’espace est pris comme caractères, surtout qu'on le rend obligatoire comme tu me la citer plus haut Oo
Maintenant tu as une regexp qui fonctionne, bravo. =D>
Comme tu le vois cette regexp contient des répétitions importantes dans le motif. Si tu veux passer à un nouvel exercice, plus corsé, pour encore mieux maîtriser les regexp, tu peux maintenant chercher à factoriser ces répétitions

pour rendre ta regexp à la fois plus courte et plus lisible (enfin là c'est une question de goût et de point de vue

)