geshi et quotes

Eléphant du PHP | 299 Messages

26 déc. 2009, 21:47

salut a tous,

j' ai integré geshi pour coloriser mes codes, pour coloriser, ca colorise, peu-etre trop.

Je m' explique, mes textes sont dans la bdd, et j' ai des [quote][/quote] aussi dans ces textes, j' aimerai uniquement que geshi intervienne sur les quotes, mais le probleme c' est que je n' arrive a coloriser toute ma page, du coup non seulement tout est coloriser mais mon html est retraduit en code. Voici l' indice a résoudre :/
					      <?php

					  
					  
					$tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
				
					$tutoc = wordwrap(code($tuto_tuto), 85, "\n");
					
					
					include_once('geshi/geshi.php'); // Inclure la librairie GeSHi
 

 

 
					$source = ?????????? je vois pas trop quoi mettre la ?????????
					
					$language = 'php'; // Définir le langage à utiliser
 
					$geshi =& new GeSHi($source, $language); // Créer un objet "GeSHi"
					echo $geshi->parse_code(); // Afficher le résultat
					?>
et mon bbcode pour les quote:
					<?php
function code($texte)
{
$texte = preg_replace('`\[quote\](.+)\[/quote\]`isU', '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>$1</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">&nbsp;</td></tr></table>', $texte);

return $texte;
}
?>
Bref si une ame genereuse pouvait me trouver la solution, parce que je pense avoir tout essayé a mon niveau.
Modifié en dernier par graffx le 28 déc. 2009, 01:13, modifié 1 fois.

Eléphant du PHP | 451 Messages

26 déc. 2009, 22:57

Je n'es pas testé mais si mes souvenir son bon j'avais fait un truc pour un blog.

Il faut utiliser preg_replace_callback().

Comme ceci:

$text = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));

$text = preg_replace_callback('/\[quote\](.+?)\[\/quote\]/s', "getGeshi", $text);

function getGeshi($match) {
     include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi =& new GeSHi($match, $language); // Créer un objet "GeSHi"

     echo $geshi->parse_code(); // Afficher le résultat
}

Voilà après je ne suis pas sur de l'expression régulière mais c'est déjà un début.

Eléphant du PHP | 299 Messages

27 déc. 2009, 00:55

hello et merci de me preter attention.

J' ai cru voir sur le sdz qu' ils parlaient de cette fonction, mais sans exemple concret, c' etait dans les forums.

Sinon j' ai essayé, resultat:

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'getGeshi', to be a valid callback in /home/villedeb/www/test/tuto.php on line 95

					      <?php

					  
					  
					$tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
				

 

					
					$tuto_tuto = preg_replace_callback('/\[quote\](.+?)\[\/quote\]/s', "getGeshi", $text);

function getGeshi($match) {
     include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi =& new GeSHi($match, $language); // Créer un objet "GeSHi"

     echo $geshi->parse_code(); // Afficher le résultat
}
					?>

Eléphant du PHP | 451 Messages

27 déc. 2009, 01:19

Bizarre chez moi ça fonctionne.

Essaye ceci:
<?php

function getGeshi($match) {
     
	 include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[1], $language); // Créer un objet "GeSHi"

     return $geshi->parse_code(); // Retourne le résultat
}

$text = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));

$text = preg_replace_callback('/\[quote\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;

?>

Eléphant du PHP | 299 Messages

27 déc. 2009, 02:33

Ha, la j' ai quelque chose. le texte apparait bien en ce qui concerne le php, je ne sais pas si on peut selectionner plusieurs language dans geshi, voici ce que j' obtiens

inscription.php :

<form method="post" action="traitement-inscription.php"><br />
pseudo : <input name="pseudo" type="text"/><br />
Mot de passe : <input name="passe" type="password"/><br />
<input name="submit" type="submit" value="OK" /><br />
</form>




traitement_inscription.php :

<?php<br />
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));<br />
$passe = mysql_real_escape_string(htmlspecialchars($_POST['passe']));<br />
$passe = sha1($passe);<br />
				  <br />
mysql_query("INSERT INTO VOTRE_TABLE VALUES('', '$pseudo', '$passe')");<br />
<br />
<br />
echo 'Membre ajout&eacute; avec succ&eacute;s';<br />
?>

Eléphant du PHP | 299 Messages

27 déc. 2009, 02:46

bon alors j' ai resolu tous les soucis, sauf un, la couleur est tres pauvre pour l' instant, je sais pas si c' est normal.

voici en attendant mon code presque parfait :)
					      <?php

					  
					  
					$tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
				

 

					
				



function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[1], $language); // Créer un objet "GeSHi"

     return $geshi->parse_code(); // Retourne le résultat
}

$text = stripslashes($tuto['tuto_tuto']);

$text = preg_replace_callback('/\[quote\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;

?>

Eléphant du PHP | 299 Messages

27 déc. 2009, 02:55

alors, je suis a nouveau coincé entre deux resultats, celui avec le code donné plus haut, coloré mais pas trop de mise en forme et le second, avec un background sur les quotes qui rend pas mal, mais plus rien n' est coloré, voici ce que j' ai fait pour le deuxieme resultat:

					      <?php

					  
					  
					$tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
				

 

					
				



function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[1], $language); // Créer un objet "GeSHi"

     return $geshi->parse_code(); // Retourne le résultat
}

$text = code(nl2br(htmlentities(stripslashes($tuto['tuto_tuto']))));

$text = preg_replace_callback('/\[quote\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;

?>


edit:

le mieux serait que j' arrive a placer dans le preg_replace_callback:


<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>Geshi</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">&nbsp;</td></tr></table>


Saurais tu comment placer ca? Moi je n' ai eu que des erreurs, bizarre

Eléphant du PHP | 451 Messages

27 déc. 2009, 11:49

Oui Geshi accepte plusieurs language le principe serait ainsi:

[ quote=php][/ quote] ou [ quote=css][/ quote]

Et dans la fontion tu change:
$geshi = new GeSHi($match[1], $language);
En:
$geshi = new GeSHi($match[2], $match[1]);
Mais l'expression régulière sera celle-ci:
'/\[quote=(.+?)\](.+?)\[\/quote\]/is'
Après pour modifié le parse il faut faire ainsi:
                                              <?php

                                         
                                         
                                        $tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
                               

 

                                       
                               



function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[2], $match[1]); // Créer un objet "GeSHi"

     $code = '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>Geshi -> '.$match[1].'</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">'.$geshi->parse_code().'</td></tr></table>'; 

     return $code; // Retourne le résultat
}

$text = code(nl2br(htmlentities(stripslashes($tuto['tuto_tuto']))));

$text = preg_replace_callback('/\[quote=(.*?)\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;
Voilà.

Eléphant du PHP | 299 Messages

27 déc. 2009, 19:26

je n' ai pas reussi, soit encore ca met bien le background mais rien n' est coloré, sois coloré mais sans background .

voila a nouveau mon texte:
					<?php
function code($texte)
{

$texte = preg_replace('`\[quote\](.+)\[/quote\]`isU', '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>$1</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">&nbsp;</td></tr></table>', $texte);



//etc., etc.

//On retourne la variable texte
return $texte;
}
?>
					      <?php

					  
					  
					$tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
				

 

					
				



function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[1], $language); // Créer un objet "GeSHi"

     return $geshi->parse_code(); // Retourne le résultat
}

$text = stripslashes($tuto['tuto_tuto']);

$text = preg_replace_callback('/\[quote\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;

?>

  
					  
				<?php

				}
				?>
J' ai pas trop compris peu etre comment adapter ce que tu m' a dit, donc je te laisse jeter un oeil :oops:

Eléphant du PHP | 299 Messages

27 déc. 2009, 20:12

avec ton code donc, background ok mais plus coloré:
					<?php
function code($texte)
{

$texte = preg_replace('`\[quote\](.+)\[/quote\]`isU', '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>$1</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">&nbsp;</td></tr></table>', $texte);


//On retourne la variable texte
return $texte;
}
?>


         <?php

                                         
                                         
                                        $tuto_tuto = nl2br(htmlentities(stripslashes($tuto['tuto_tuto'])));
                               

 

                                       
                               



function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[2], $match[1]); // Créer un objet "GeSHi"

     $code = '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>Geshi -> '.$match[1].'</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">'.$geshi->parse_code().'</td></tr></table>';

     return $code; // Retourne le résultat
}

$text = code(nl2br(htmlentities(stripslashes($tuto['tuto_tuto']))));

$text = preg_replace_callback('/\[quote=(.*?)\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;
?>

  
					  
				<?php

				}
				?>

Eléphant du PHP | 451 Messages

27 déc. 2009, 21:13

Chez moi je fais:
<?php

$tuto = "voici un test [quote=php]<?php funcion get() { return; } ?>[/quote] une autre citation [ quote]Ma citation du jour[/ quote] et un autre code [quote=css]#class{ text-align:center; }[/quote]";

function code($texte)
{

$texte = preg_replace('`\[quote\](.+)\[/quote\]`isU', '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>$1</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">&nbsp;</td></tr></table>', $texte);


//On retourne la variable texte
return $texte;
}

function getGeshi($match) {
     
         include_once('geshi/geshi.php'); // Inclure la librairie GeSHi

     $language = 'php'; // Définir le langage à utiliser
 
     $geshi = new GeSHi($match[2], $match[1]); // Créer un objet "GeSHi"

     $code = '<table width="1000" border="0" cellspacing="0" cellpadding="0"><tr><td height="20" background="images/quoteh.gif">&nbsp;</td>
</tr><tr><td background="images/quotem.gif"><table width="980" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td>Geshi -> '.$match[1].'</td></tr></table></td></tr><tr><td height="20" background="images/quoteb.gif">'.$geshi->parse_code().'</td></tr></table>';

     return $code; // Retourne le résultat
}

$text = code(nl2br(stripslashes($tuto)));

$text = preg_replace_callback('/\[quote=(.*?)\](.*?)\[\/quote\]/is', 'getGeshi', $text);

echo $text;

?>
Et le code se colorise très bien et le background apparait.

Donne moi le code complet de ta page stp.

Eléphant du PHP | 299 Messages

27 déc. 2009, 21:34

Je t' envoi un mp pour que tu vois par toi-meme

j' ai copié collé ton code dans le doute

Eléphant du PHP | 299 Messages

27 déc. 2009, 23:57

Merci a toi pour ce probleme que tu as durement résolu, je n' aurai pas réussi avec mes compétences.

Cependant, y-a t il un moyen pour que geshi colorise tous les language? sql, html, php au lieu de seulement php?

Eléphant du PHP | 451 Messages

28 déc. 2009, 00:03

Et ben pour tout les language il faut faire quote=php ou quote=css ou quote=sql etc

Et pour le html aussi sinon le formulaire apparait hors que si tu spécifie html dans quote le html sera affiché comme il doit

Eléphant du PHP | 299 Messages

28 déc. 2009, 00:18

Effectivement il faut mettre precisement quote=html4strict et ca marche.


Cependant, encore un leger detail troublant.

j' ai enlever le nl2br sur la totalité du contenu. Geshi doit deja avoir un nl2br quelque part.


Ce qui fait que si j' enleve le nl2br de mon contenu, les quotes sont parfaites mais le hors-quote , tout se suit a la ligne. Si je remet le nl2br sur le contenu, le hors-quote est nickel mais des <br /> apparait dans les quotes. Quel casse-tete!!!

Auriez vous une solution svp?