bonjour à tous, voilà je suis en train de réinventer la roue, actuellement je travail avec un site + un forum phpbb le but et de pouvoir afficher en [u]clair[/u] les messages, donc en remplaçant les BBcodes enregistrés dans les message de la BD [code] $message=str_replace('{SMILIES_PATH}', './forum/images/smilies/', $topic->post_text); $message=str_replace(CHR(10), '
', $message); $message=str_replace(":".$topic->bbcode_uid, "", $message); $message=str_replace("'", "\'", $message); $message=str_replace("[/img]", "">", $message); $message=str_replace("[img]", " ", $message); $message=str_replace("**", "", $message); $message=str_replace("*", "", $message); $message=str_replace("*", "", $message); $message=str_replace("[u]", "<u>", $message);
$message=str_replace("[/u]", "</u>", $message); $message=str_replace("[video]", " Liens vers une vidéo", $message); $message=str_replace("[/u]", "", $message); //
...
//$message=str_replace("[quote="Jerem"]", $message=str_replace("[quote="", "
origine:", $message); $message=str_replace(""]", "
", $message); $message=str_replace("[/quote]", "
", $message); $message=str_replace("[size=50]", "", $message); $message=str_replace("[size=85]", "", $message); $message=str_replace("[size=100]", "", $message); $message=str_replace("[size=150]", "", $message); $message=str_replace("[size=200]", "", $message); $message=str_replace("[/size]", "", $message); $message=str_replace(""", '"', $message); [/code] ok je réinvente la roue, et c'est pas forcément super optimisé, mais pour l'instant le résultat et celui escompté, c'est à dire afficher correctement avec les images, les quotes et autre bbcodes standard d'un forum et la je but sur ce bbcode [code][color=#FF0040]couleur[/color][/code] [color=#FF0040] je souhaiterai en faire çamais comme le code couleur n'est jamais le même et que crée tous les variantes de couleur........... quelle approche je pourrais prendre si str_replace avait un systéme de joker je pourrais je pense trouver une solution mais à priorie non et donc je séche. pourriez vous m'aidez Merci d'avance flo
Arf, je suis emporté par ma fougue et personne pige plus rien a ce que je raconte :( Pour ton problème (remplacer des bbcodes par du html valide), il y a globalement deux cas de figure: 1/ Un remplacement simple ([video] en <video>, typiquement, ou les balises i, ou b, ou u, etc ...)
2/ Un remplacement qui nécessite ce qu'on appelle une backreference
1/ Pour le truc simple, j'i vu que tu utilises 50 000 str_replace. Je suis persuadé que ca marche sans problème, mais pour des raison des clarté du code et de perforences PHP, je te suggere a la place d'utiliser str_replace avec des tableaux (voir mieux: un seul strtr() ...)
[code]
// str_replace avec deux tableaux
$search = array( 'foo1', 'foo2', 'foo3'); // Tableau des trucs a chercher
$replace= array( 'bar1', 'bar2', 'bar3'); // Tableau des remplacements
$string = 'test test foo2 test foo1';
$newString = str_replace( $search, $replace, $string );
echo $newString // retourne: 'test test bar2 test bar1'
[/code]
A chaque occurence d'un élément existant dans l'array #search, il est remplacé par l'élément de meme index de $replace.
Mais il y a mieux: Au lieu d'utiliser deux tableaux, et au risque de te paumer entre les indexes de l'un et de l'autre, tu peux utiliser un seul tableau associatif. PHP va chercher les clés de ton array, et les remplacer par les valeurs correspondantes.
[code]
$searchAndReplace = array(
'foo1' => 'bar1', // foo1 sera remplacé par bar1
'foo2' => 'bar2', // foo2 sera remplacé par bar2
'foo3' => 'bar3' // etc ...
);
$string = 'test test foo2 test foo1';
$newString = strtr( $string, $searchAndReplace );
echo $newString // retourne: 'test test bar2 test bar1'
[/code]
C'est plus clair, plus facile a maintenir aussi.
2/ Pour les backreferences: tu cherches a trouver une portion de texte, qui contient elle-meme une partie variables que tu veux garder telle quelle (alors que ce qu'il y a autour doit changer ... c'est le cas pour des couleurs, mais aussi des tailles de police par exemple, ou des liens ...).
Ceci n'est pas possible sans utiliser les regex et preg_replace. La solution que je te donne marche pour les couleurs, a toi d'adapter ensuite pour autre chose si besoin:
[code]
$string = "test [color=#FF0040]test[/color] test";
$pattern = "/([color=#)([a-zA-z\d]{6})(])(.+)([\/color])/i";
$replacement = '<span style="color:#${2};">${4}</span>';
$newString = preg_replace($pattern, $replacement, $string);
echo $newString;
[/code]
Explications:
Si j'éclate un peu $pattern on observe 5 parenthèses:
[code]
$pattern = "/ ([color=#) ([a-zA-z\d]{6}) (]) (.+) ([\/color]) /i";
^--1 ^--2 ^--3 ^--4 ^--5
[/code]
(#1) -> cherche le début de ton tag, correspond a
[code][color=#[/code]
(#2) -> correspond au code couleur
[code]FF0040[/code]
(#3) -> correspond au crocher fermant
[code]][/code]
(#4) -> correspond a un ensemble de caractères (en l'occurence, te texte a mettre en couleur).
[code]bla bla bla mon texte qui doit etre en couleur[/code]
(#5) -> correspond a ta balise couleur fermante
[code][/color][/code]
Ce que tu veux c'est récupérer les parenthèses #2 (code couleur) et #4 (texte) pour les insérer dans tes balises html a toi. Pour cela tu dois utiliser les backreferences ${2} et ${4} dans ton texte de remplacement.
Attention: ce texte doit etre écrit entre [u]simple quotes[/u] ', sinon PHP pense que tu parles de variables et lieu de backreferences:
[code]
$replacement = '<span style="color:#${2};">${4}</span>';
Utilise backreference 2 (couleur)--^ ^--Utilise backreference 4 (le texte a colorer)
[/code]
Fais le teste toi-meme avec mon code, ca sera plus simple.
Ensuite tu peux faire pareil pour les liens, les images, etc ...</video>
Nouvelle version améliorée, vérifiée, débuggée ... manque plus que ca fasse la café tout seul: [code]$string = "test [color=#FF0040]test[/color] test"; $pattern = "/([color=#)([a-zA-z\d]{6})(])(.+)([\/color])/i"; $replacement = '${4}'; $newString = preg_replace($pattern, $replacement, $string); echo $newString;[/code] *(tadaaaaaaaam)*
Nan mais je suis con, il y a strtr(), meme, que tu devrais utiliser:
$replacement = array(
'[video]' => '<video>',
'[/video]' => '</video>',
// ... etc ...
);
$newString = strtr( $bbcodeString, $replacement);
strtr() remplace les occurences des clés de ton tableau associatif (ici les bb codes) par leur valeurs respectives (les balises html correspondantes).
salut Vallyan
encore une fois tu me viens en aide merci.
Alors, pour le premier encart, l'utilisation du tableau été prévue, mais aurai été mis en place à la fin une fois tous les BBCode recodés.
Si je comprend bien:
le seconde encart serai spécifique pour des balises étant constitué d'élément non constant (code couleur..) et le troisième et une version amélioré du str_replace et ne peux gérer les balises de type couleur.
Excuse moi de poser la question je ne peux tester ce matin je suis court en temps.
En tout cas merci beaucoup, car je sais que ce genre de script indépendant des templates phpbb sont rares et que grâce à toi, cela risque de faire des heureux.
voilà j'ai bien avancé mais il me reste 2 régles qui me résiste [code]$pattern = "/([url])(.+)([\/url])/i"; $replacement = ' lien'; $message = preg_replace($pattern, $replacement, $message); $pattern = "/([url=)(.+)(])(.+)([\/url])/i"; $replacement = ' ${4}'; $message = preg_replace($pattern, $replacement, $message);[/code] la premiére est faite pour transcrire comme ceci [code]"[url]http://fsfrancesimulateur2.fr/[/url]" lien[/code] et elle marche et la seconde régle qui doit faire ceci !!!!aprés avoir relu 6 fois le message je conclu que le forum de graf interpréte mon code!!!! *correspon au crochet [code] "*url=http://fsfrancesimulateur2.fr/\*FFS2\*/url*" FFS2[/code] mais la seconde ne marche pas correctement et renvoie [code][url=http://fsfrancesimulateur2.fr/]FFS2">lien[/code] donc j'en conlu que les 2 régles rentrent en conflit, ou que la seconde ne démarre pas et que la premiére fait ce quelle peut. Pour l'instant je cherche de mon côté, je pense que c'est le début de la seconde régles aprés le = qui est fausse, mais je n'ai pas encore trouvé l'erreur. sinon voici le fichier complet [code]<?php echo "<br>================================================
"; $message=$topic->post_text; $message=str_replace(":".$topic->bbcode_uid, "", $message); $correspondance = array( CHR(10)=>'
', '{SMILIES_PATH}'=>'http://background.fsfrancesimulateur2.fr/forum/images/smilies/', ":".$topic->bbcode_uid=>"", '**'=>' ', '**'=>'', '[u]'=>'<u>',
'[/u]'=>'</u>', '*'=>'', '*'=>'', '[img]'=>' ', "'"=> "\'", '[video]' => ' [Liens vers une vidéo](',
'[/video]' => ')', '[url]'=> ' [lien](',
'[/url]'=> ');', '[quote="'=>'
origine:', '"]'=>'
', '[/quote]'=>'
', '[quote]'=>'
', '[size=50]'=>'', '[size=85]'=>'', '[size=100]'=>'', '[size=150]'=>'', '[size=200]'=>'', '[/size]'=>'' ); $message = strtr( $message, $correspondance); $message=str_replace($fichiers, $code, $message); $pattern = "/([attachment=)([0-9]{1,3})(])(.+)([\/attachment])/i"; $replacement = ' '; $message = preg_replace($pattern, $replacement, $message); $pattern = "/([url])(.+)([\/url])/i"; $replacement = ' lien'; $message = preg_replace($pattern, $replacement, $message); $pattern = "/([url=)(.+)(])(.+)([\/url])/i"; $replacement = ' ${4}'; $message = preg_replace($pattern, $replacement, $message); //convertion balise complexe color by Vallyan $pattern = "/([color=#)([a-zA-z\d]{6})(])(.+)([\/color])/i"; $replacement = '${4}'; $message = preg_replace($pattern, $replacement, $message); $message."
"; $message=str_replace("<!-- ia0 -->", '', $message); //suppresion de suite caractére d'originie incunnu echo $message=str_replace(""", '"', $message); //rajout de double guillement codé à priorie encore util ?>[/code] j'aimerai ton avis, sans trop vouloir abuser
Ben il faut que tu vires [code]'[url]'=> ' [lien](',
'[/url]'=> ');',[/code] de ton array $correspondance ! Soit tu utilises $correspondance pour les rempacements de balises simples, soit tu utilises preg_replace pour les trucs qui necessitent un backref. Mais c'est pas les deux sinon elles sont en conflit.
oups, enfin non,
oui il y avait doublons, et donc renvoyé une fausse réponse, mais en supprimant les doublons la régles 2 est totalement muette, plus de retour dutout
trouvé,
pas trop compris mais bon,
j'ai inversé l'ordre des 2 régles et c'est partis, je pense que la premiéres régles n'est pas assez stricte et se lance alors qu'elle ne devrait pas
techniquement tu aurai spu les combiner en une seule en fait ... mais si ca marche, c'est impeccable
heu comment aurais tu fait, car je viens de faire un test de malade et ça merde j'ai envoyé ça [code] [url]http://fsfrancesimulateur2.fr/[/url] [url=http://fsfrancesimulateur2.fr/]FFS2[/url] abcdef[/quote] allez on embrouille le tout +test d'élément imbirqué formation des planeurs .... encore plus dur : [url=http://www.noelshack.com/2014-08-1392659280-capture01.png][img]http://image.noelshack.com/minis/2014/08/1392659280-capture01.png[/img][/url] [url=http://www.noelshack.com/2014-08-1392659284-capture02.png][img]http://image.noelshack.com/minis/2014/08/1392659284-capture02.png[/img][/url] [url=http://www.noelshack.com/2014-08-1392659287-capture03.png][img]http://image.noelshack.com/minis/2014/08/1392659287-capture03.png[/img][/url] [url=http://www.noelshack.com/2014-08-1392659399-capture04.png][img]http://image.noelshack.com/minis/2014/08/1392659399-capture04.png[/img][/url] [url=http://www.noelshack.com/2014-08-1392659402-capture05.png][img]http://image.noelshack.com/minis/2014/08/1392659402-capture05.png[/img][/url] tentés ???? :mrgreen: :mrgreen: :mrgreen:[/code] et il m'a renvoyé: [code] [
allez on embrouille le tout
+test d'élément imbirqué
formation des planeurs ....
encore plus dur :
[url=http://www.noelshack.com/2014-08-1392659280-capture01.png] [/url]
[url=http://www.noelshack.com/2014-08-1392659284-capture02.png] [/url]
[url=http://www.noelshack.com/2014-08-1392659287-capture03.png] [/url]
[url=http://www.noelshack.com/2014-08-1392659399-capture04.png] ">lien](http://fsfrancesimulateur2.fr/[/url]<BR><a href=)[/code]
Ben la ... difficile de reproduire tes trucs vu que le forum fait la conversion de certains de tes bbcodes ... du coup je ne sais pas exactement quel est ton code, quel est ton input, et quel est ton output
Tout ce que je peux te conseiller c'est de désactiver tes modules de conversion un par un, et de regarder quel est ton output au fur et a mesure que tu les ajoutes pour voir ou ca merdoie ...
alors ce sont mes balise url qui bricole, tu parlais, de pouvoir les réunir en une, mais je n'y arrive pas j'ai essayé ça, mais je suis dans les choux [code]$pattern = "/([url)([a-zA-z\=\/.\d]{0,300})(])(.+)/i"; $replacement = ' ${4}'; $message = preg_replace($pattern, $replacement, $message);[/code] et j'ai un str_replace pour fermer avant, la balise [url] simple est bien transcrite, mais pas la [url=]
bon je ne cris pas victoire, mais... j'ai simplifié les 2 régles et ça tourne correctement [code]$pattern = "/([url=)(.+)(])(.+)([\/url])/"; $replacement = ' ${4}'; $message = preg_replace($pattern, $replacement, $message); $pattern = "/([url])(.+)([\/url])/"; $replacement = ' ${2}'; $message = preg_replace($pattern, $replacement, $message);[/code]