Traitement PHP pour balises type BBCODE

Traitement PHP pour balises type BBCODE - PHP - Programmation

Marsh Posté le 21-02-2007 à 14:10:54    

Bonjour,
 
Je met en place un système de propositions d'articles pour mon site,
Pour faire un lien dans leur article vers un logiciel référencé dans la base de donnée, les visiteurs sont invités à utiliser la synthaxe [log]id du logiciel[/log] :
chaine qui devra être remplacée par le nom du logiciel, avec un lien pointant vers une certaine adresse.
Ainsi, un simple preg replace ne suffit pas.
 
j'avais ainsi pensé vaguement à un preg replace suivit d'un eval, sans grande surprise cela ne marche pas :
 

Citation :

  $contenu = htmlentities($donnees['contenu']);
   $contenu = preg_replace("!\[log\](.+)\[/log\]!Ui","\".logiciel($1).\"",$contenu);
   eval("\$contenu = $contenu;" );


 
avec pour fonction logiciel :

Citation :

function logiciel($idlogiciel)
{
 $reponse = mysql_query("SELECT * FROM logiciels WHERE idlogiciel='$idlogiciel'" );
 while ( $donnees = mysql_fetch_array($reponse) )
 {
  $lien = "<a href=\"article-$idarticle-$idlogiciel.html\">".$donnees['nom']."</a>";
 }
 return($lien);
}


 
Comment appliquer cette fonction ?
 
Merci

Reply

Marsh Posté le 21-02-2007 à 14:10:54   

Reply

Marsh Posté le 21-02-2007 à 14:28:20    

Avec preg_replace, tu peux remplacer le contenu de [log]...[/log], et appeller une fonction qui va filer le remplacement. Avec le modifier 'e', c'est possible, regarde dans la doc de preg_replace, exemple 1626

Reply

Marsh Posté le 21-02-2007 à 15:26:07    

J'ai beau essayer de m'acrocher, j'ai vraiment du mal à comprendre preg replace,
j'ai essayer plusieurs choses, dont ca,  
forcement, ca ne fonctionne pas

Citation :

$contenu = preg_replace("/\[log\](.+)\[/log\]/e",".logiciel('\\1').",$contenu);


Pourrais je avoir une aide un petit plus précise ?
merci pour cette premièr réponse en tout cas

Reply

Marsh Posté le 21-02-2007 à 16:03:16    

http://forum.hardware.fr/hfr/Progr [...] 1480_1.htm
 
Si ca peut t'aider, j'ai planché dessus cette semaine

Reply

Marsh Posté le 21-02-2007 à 17:59:29    

Les quotes sont très importantes, ce sera plutôt de la forme :

Code :
  1. $contenu = preg_replace("/\[log\](.+)\[/log\]/e", "logiciel('\\1')", $contenu);

Reply

Marsh Posté le 21-02-2007 à 18:35:46    

Attention aussi à escaper les / dans la regex si on l'entoure de /.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-02-2007 à 22:22:22    

Je suis désolé c'est encore du chinois pour moi;
Florent, toujours même erreur on dirait :  

Citation :

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'l' in /home/henol/public_html/v2/pages/article-pre.php on line 101


je sais que j'en demanderais beaucoup si je demandais le preg_replace qui conviendrait dans mon cas, et qu'on m'explique en très gros les symboles, mais on sais jamais :)

Reply

Marsh Posté le 21-02-2007 à 22:33:59    

D'où mon dernier message...  
 
Escaper = mettre un backslash devant.
 
Donc  
$contenu = preg_replace("/\[log\](.+)\[\/log\]/e", "logiciel('\\1')", $contenu);
 
(ou remplacer le caractère englobant par autre chose... j'aime bien # qu'on retrouve rarement à l'intérieur)
 
Sinon, remets l'option U au passage.


Message édité par sielfried le 21-02-2007 à 22:34:13

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 21-02-2007 à 22:44:16    

Ok j'arrivais à l'instant a faire fonctionner ca mais c'était bien moins propre que ce qe tu me propose;
en tout cas merci beaucoup.
Preg replace reste vraiment un monde a part, faudrait que je m'attarde dessus parceque là j'arrive pas a piger une seul des phrases explicatives.
La par exemple c'est caractère englobant que je pige pas :p

Reply

Marsh Posté le 21-02-2007 à 22:55:55    

Il est préférable d'utiliser preg_replace_callback(), qui est plus adaptée à ta situation.
 
http://fr.php.net/preg_replace_callback


---------------
ilonet - Internet, Informatique et Webmastering
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed