JeuWeb - Crée ton jeu par navigateur
interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : interpréter du contenu pour le modifier (genre bbcode) oui mais ... (/showthread.php?tid=4477)



interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Ter Rowan - 08-12-2009

hello

j'ai une problématique qui doit certainement se régler facilement à coup de regex ou autres, mais n'étant pas très spécialisé dans le traitement de chaines de caractères, je ne sais pas trop comment avancer.

mon besoin :

je reçois un texte avec en son sein des éléments "enrichis"

exemple :

Citation :voici un {b}texte{/b} très intelligent qui permet de représenter ce que j'essaie d'expliquer en suivant les {ref}normes rowanesques{/ref} que j'ai pu définir

imaginons que {} soit [] on se retrouve dans du bbcode classique (pour [b] )

je souhaite transformer ce texte en :

Code PHP :
<?php 
$texte
="voici un <strong>texte</strong> très intelligent qui permet de représenter ce que j'essaie d'expliquer en suivant les
<a id='3' href='http://lapage?id=3'>normes rowanesques</a> que j'ai pu définir
<div class='cache' id='s3'>cliquer sur le lien pour atteindre l'article des normes rowanesques</div>"
;

on constate que : [b] se transforme en <strong>, ça je sais faire :

Code PHP :
<?php 
$texte
=str_replace("[b]", "<strong>", $texte);
$texte=str_replace("[/b]", "</strong>", $texte);

par contre je souhaite que [ref]normes rowanesques[/ref] soit identifié et me permette:
de remplacer dans le texte [ref]normes rowanesques[/ref] par
Code PHP :
<?php 
$t
= "<a id='".$ref['normes rowanesques']." href='http://lapage?id=".$ref['normes rowanesques']."'>".$lib['normes rowanesques']."</a> ";


et que en fin de texte, parce que j'aurais stocké quelque part l'id 3, je puisse afficher
Code PHP :
<?php 
$texte
.="<div class='cache' id='s".$ref['normes rowanesques']."'>".$descr["normes rowanesques"]."</div>";
ce dernier div me permettant par javascript de faire apparaître lors du survol du lien des petites infos (éventuellement plusieurs div si plusieurs références, soyons fous)

où $ref, $lib et $descr sont des tableaux indicés par la chaine à rechercher qui contiennent pour $ref l'id de l'article concerné, $lib le libellé du corps de texte à afficher et $descr la petite description qui apparaitra en fin de div.

j'ai fouillé un peu sur le net, je suis tombé sur une regex qui permet quelquechose d'un peu plus simple :

Code PHP :
<?php 
$regLienSimple
="\[url\] ?([^\[]*) ?\[/url\]";
if (
ereg($regLienSimple, $description)) $description=preg_replace($regLienSimple, "<a href=\"\\1\">\\1</a>", $description);

pas très familier, je vois bien que la regex identifie du contenu, mais uniquement dans la fonction regex (je ne vois pas comment exploiter la chaine "1" trouvée par exemple) etc...

vous avez une idée ?


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Kassak - 08-12-2009

$message = preg_replace('`\[ref\](.+)\[/ref\]`isU', '<div id="blabla">$1</div>', $message);

ceci ne fonctionne pas ? remplace la div par ce que tu veux... ?


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Zamentur - 08-12-2009

Une piste:preg_replace_callback


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Ter Rowan - 08-12-2009

Merci pour vos premières réponses
(08-12-2009, 04:48 PM)Kassak a écrit : $message = preg_replace('`\[ref\](.+)\[/ref\]`isU', '<div id="blabla">$1</div>', $message);

ceci ne fonctionne pas ? remplace la div par ce que tu veux... ?

le problème est que tu ne fais que remplacer un élément (enfin tel que je le comprends), pas d'obtenir l'élément et de le traiter avec intelligence => avec l'élément je dois décider si il faut mettre id="blabla" ou id="bloblo" ou ..., et modifier $1 et ajouter en fin de page des infos supplémentaires

c'est ce "et" que je n'arrive pas à faire, mais peut être ai je mal compris Smile

(08-12-2009, 04:53 PM)Zamentur a écrit : Une piste:preg_replace_callback

c'est peut être la bonne piste, en tout cas ça pourrait y ressembler ^^ il faut que je teste cela, merci


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Gabriel - 08-12-2009

J'ai fais ceci pour mon système de chat :


$texte = preg_replace('#\{gras\}(.+)\{/gras\}#isU', '<strong>$1</strong>', $texte);

Tout tient en une ligne


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Ter Rowan - 09-12-2009

(08-12-2009, 04:53 PM)Zamentur a écrit : Une piste:preg_replace_callback

je suis embêté (pas encore essayé mais je tape du code sans avoir php au bureau là...) en effet j'aimerai que la fonction appelée soit une méthode de classe

mais comment faire ?

Code PHP :
<?php 
$texte
= preg_replace_callback("\[ref\]([^\[]*)\[/ref\]", "$this->ajouteReference", $texte);

ce code pourrait marcher ?

en tout cas, si cela marche , la solution me conviendrait Smile
sinon, il faudrait que je parte sur du procédural, avec des variables statiques dans tous les sens (enfin deux ^^), beurk quoi :p
et puis je me lance tiens (boulot pas top aujourd'hui ^^)

il est possible qu'il y ait quelques fautes de syntaxe, je ne pourrais valider que cette nuit mais qu'en pensez vous ?

Code PHP :
<?php 
function bbCode($texte)
// remplace les balises BBCode par des balises HTML
{
$texte = remplace($texte,'b');
$texte = remplace($texte,'i');
$texte = remplace($texte,'u');


// \\1 est le résultat de la première ( ), \\2 de la deuxieme, etc ... \\0 est l'ensemble
// dans le cas ci dessous, on s'attend à avoir le formalisme [img]http//www.ddd.ddd.ddd.gif alt="description du alt"[/gif]
// IMAGES
$texte=preg_replace("\[img\]([^\[]*) ?alt=\"([^[]*)\"\[/img\]",
"<img src=\"\\1\" alt=\"\\2\" />", $texte);

// dans le cas ci dessous, on s'attend à avoir le formalisme [ref]toto le beau[/gif]
// REFERENCES
$texte = preg_replace_callback("\[ref\]([^\[]*)\[/ref\]", "ajouteReference", $texte);

return
$texte;
}

function
ajouteReference($correspondance)
{
static
$ref = NULL;

if (
$ref === NULL )
{
//chargement PDO
}

if (isset(
$ref[$correspondance[1] ] ) )
{
$r = "<a class='lienBulle' id='".$ref[$correspondance[1] ]['id'].
"' href='http://lapage?id=".$ref[$correspondance[1] ]['id']."'>".
$ref[$correspondance[1] ]['label']."</a>";
$r .="<div id='s".$ref[$correspondance[1] ]['id']."' class='bulle cache'>".
$ref[$correspondance[1] ]['description']."</div> ";
}
else
$r ="[erreur sur ".$correspondance[1]." ==> pas trouvé de référence]";
return
$r;
}

function
remplace($texte, $bb, $html=NULL)
{
if (
$html === NULL)
$html = $bb;

$texte=preg_replace('\['.$bb.'\]', '<'.$html.'>', $texte);
$texte=preg_replace('\[/'.$bb.'\]', '</'.$html.'>', $texte);

//ou bien
$texte=preg_replace('\['.$bb.'\](.+)\['.$bb.'\]', '<'.$html.'>//1</'.$html.'>', $texte); // à voir le plus rapide
return $texte;
}



RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - QuentinC - 09-12-2009

Passer une fonction membre en tant que fonction callback est possible, mais pas de la façon que tu proposes.
En fait il faut passer un tableau qui contient en premier argument l'objet à manipuler, et en deuxième élément le nom de la méthode en tant que chaîne. Donc ici ce serait preg_replace_callback(..., array($this, 'ajouterReference'), ...)


RE: interpréter du contenu pour le modifier (genre bbcode) oui mais ... - Anthor - 09-12-2009

EDIT: Autant pour moi, grosse grosse fatigue aujourd'hui !