Bonjour,
J'ai appris récemment les expressions régulières et j'ai de gros problèmes avec la balise BBcode \[color\].

Voilà 24h que je tourne en rond...
Tout d'abord, j'ai remplacé les balises comme ceci :
$regle_color4 = '#\[color=(White|DarkRed|LightSalmon|PaleVioletRed|DarkOrange|DarkKhaki|\#EC0E0E|Gold|Olive|LightSeaGreen|RoyalBlue|DodgerBlue|MidnightBlue|ForestGreen|DarkOrchid)\](.+)\[/color\]#isU';

while(preg_match($regle_color4, $contenu)){
      $contenu = preg_replace($regle_color4, '<span style="color: $1;">$2</span>', $contenu);
}
$contenu = preg_replace('#\[color[\w./=-]*\]|\[/color\]#isU', '', $contenu);

La boucle while sert à pouvoir embriquer des balises.
Or, il y a des exceptions. Lorsqu'une balise [u] (souligner) est placé avant, le texte est coloré mais pas son soulignement.
Pareil pour les liens, ils ne prennent pas la couleur du span.
J'ai donc fini par faire :

$regle_color1 = '#\[color=(White|DarkRed|LightSalmon|PaleVioletRed|DarkOrange|DarkKhaki|\#EC0E0E|Gold|Olive|LightSeaGreen|RoyalBlue|DodgerBlue|MidnightBlue|ForestGreen|DarkOrchid)\](.*)(<a href="(.+)")(>.+</a>)(.*)\[/color\]#isU';

$regle_color2 = '#(<a href="(.+)">(.*))\[color=(White|DarkRed|LightSalmon|PaleVioletRed|DarkOrange|DarkKhaki|\#EC0E0E|Gold|Olive|LightSeaGreen|RoyalBlue|DodgerBlue|MidnightBlue|ForestGreen|DarkOrchid)\](.+)\[/color\]((.*)</a>)#isU';

$regle_color3 = '#\[u\](.*)\[color=(White|DarkRed|LightSalmon|PaleVioletRed|DarkOrange|DarkKhaki|\#EC0E0E|Gold|Olive|LightSeaGreen|RoyalBlue|DodgerBlue|MidnightBlue|ForestGreen|DarkOrchid)\](.+)\[/color\](.*)\[/u\]#isU';

$regle_color4 = '#\[color=(White|DarkRed|LightSalmon|PaleVioletRed|DarkOrange|DarkKhaki|\#EC0E0E|Gold|Olive|LightSeaGreen|RoyalBlue|DodgerBlue|MidnightBlue|ForestGreen|DarkOrchid)\](.+)\[/color\]#isU';

$contenu = preg_replace($regle_color1, '[color=$1]$2[/color]$3 style="color:$1;"$5[color=$1]$6[/color]', $contenu);

$contenu = preg_replace($regle_color2, '$1[color=$4][u]$5[/u][/color]$6', $contenu);

$contenu = preg_replace($regle_color3, '[u]$1[/u][color=$2][u]$3[/u][/color][u]$4[/u]', $contenu);

while(preg_match($regle_color4, $contenu)){
       $contenu = preg_replace($regle_color4, '<span style="color: $1;">$2</span>', $contenu);
}

$contenu = preg_replace('#\[color[\w./=-]*\]|\[/color\]#isU', '', $contenu);

C'est une catastrophe :

[color=#EC0E0E][size=16]Nouvelles[/size] façons [url\]https://iconic-i-clash.com[/url][color=Gold] de réagir avec les GIFS ![/color][/color]
[color=Olive][mail\]contact@iconic-i-clash.com[/mail][/color]
[color=DodgerBlue][url\]https://iconic-i-clash.com[/url][/color]
:angel:
[img\]upload/1622128975-82357-capture.png[/img\]
[img\]upload/1622128988-82357-capture2.png[/img\]
Comment est-ce que je peux améliorer mon BBcode \[color\] ?

Aussi, je ne comprends pas la signification de (?<!www) dans #(((https?|ftp)://(w{3}\.)?)(?<!www)(\w+-?)*\.([a-z]{2,4}))# . C'est étrange de mettre un ? devant une parenthèse, puisque ça signifie doit apparaître 0 ou 1 fois. Je ne comprends pas non plus < et ! signifie la négation ?

Une toute dernière chose: lorsque j'ai une url avec une variable et un &, il est remplacé par &amp; dois-je supprimer amp; de l'url ? C'est bizarre car à chaque modification du billet, amp; est rajouté après & ...

Un tout dernier point concernant <option> et les évènements javascript.
L'évènement onclick ne marche pas sur <option>. C'est énervant.
C'est pourquoi je l'ai mis sur le select. Catastrophe, j'ai pleins de balises qui apparaissent.
J'ai opté pour l'évènement onchange. Or, lorsque l'utilisateur veut utiliser 2 fois la même couleur, il ne peut pas.

Comment puis-je sélectionné l'option Aucune couleur automatiquement après en avoir sélectionné une ?

Un très grand merci pour votre aide !
Modifié par Louis_9876 (27 May 2021 - 17:30)
Bonjour,
Louis_9876 a écrit :
Aussi, je ne comprends pas la signification de (?<!www)

C'est un lookbehind négatif : (?<!a)b sélectionne un caractère b s'il n'est pas précédé d'un caractère a.
Louis_9876 a écrit :
C'est étrange de mettre un ? devant une parenthèse, puisque ça signifie doit apparaître 0 ou 1 fois

Quand l'élément précédent n'est pas un métacaractère, oui, mais pas ici.
a écrit :
Un point d'interrogation placé immédiatement après une parenthèse ouvrante indique que l'on souhaite changer le comportement du groupe. Le caractère suivant indique le changement : deux-points pour annuler la capture, croisillon pour un commentaire, etc. Un caractère ne correspondant pas à une commande connue provoque une erreur de compilation de l'expression.

Je laisse quelqu'un d'autre répondre au sujet (faire du bbcode avec des regex est hasardeux)
Merci pour ta réponse, je suis en train de regarder les Lookahead, les lookbehing, etc...
Hasardeux veut dire que c'est imprécis ? et donc qu'il faut que je fasse quelque chose sans les regex ?
Modifié par Louis_9876 (28 May 2021 - 12:13)
Oui, hasardeux car malgré la puissance des regex, certains contrôles ne seront pas possibles et peuvent aboutir à du code HTML mal formé (par exemple <b>....<i>......</b>.....</i>). Autre exemple problématique qu'on voyait sur ce forum, c'est l'interprétation systématique des bbcodes alors qu'on voudrait les inhiber dans certains cas, notamment [ i ] au sein de [ code ].

J'utilise donc une seule expression qui va scinder la chaîne en groupes de 4 éléments : du texte (peut être vide), le bbcode ouvrant, le contenu, le bbcode fermant.
EDIT : je me suis planté, la scission produits 3 tableaux avec texte + balise ouvrante ou fermante, texte seul, et balise (sans crochets). Ce qui ne change rien au mécanisme qui suit.
    $regex = '#([^\\[\\]]*)(?:\\[([^\\[\\]]+)\\])?#';
    $tokens = array();
    preg_match_all($regex, $s, $tokens);

Je parcours tout ce petit monde en créant une espèce de DOM perso dans lequel je peux faire les contrôles d'imbrications, etc. Ça demande un peu de boulot.
Modifié par Seven tears (28 May 2021 - 18:48)
Bonjour, désolé pour le retard Smiley sweatdrop
J'ai relu plus attentivement votre sujet, il y a effectivement des problèmes avec les regex, mais aussi avec les CSS. Si le code produit est
<span style="color:gold;">foo <a href="#">bar</a></span>
il est normal que le lien ne soit pas doré mais de la couleur qui lui a été attribué (bleu, par défaut). C'est donc du coté de CSS qu'il faut regarder et non des regex, par exemple :
span[style] a{color:inherit;}

Modifié par Seven tears (07 Jun 2021 - 10:55)
C'est bon !

Je suis content de ne plus avoir de problème...
En effet, la rêgle 1 provoquait tout les problèmes et était inutile...
Un très grand merci pour ton aide, c'était un problème tout bête mais je suis passé à côté Smiley pleure .
J'ai aussi supprimé la rêgle avec le soulignement que j'ai remplacé par .color\=darkred{text-decoration: inherit;}.
Tant qu'à faire, j'ai supprimé la rêgle avec les balises color dans les liens car elle est également inutile (j'interdis toutes balises dans \[url\] et \[mail\], ou sinon ça créer des bugs si l'utilisateur ne le comprends pas).
Bref, je n'ai plus aucun problème !

Bonne journée et merci beaucoup !
Modifié par Louis_9876 (10 Jun 2021 - 11:56)