GeShi & BBcode...

Eléphant du PHP | 447 Messages

18 juil. 2010, 07:54

Hi every one,

je voudrais utiliser GeShi pour manipuler du texte envoyé par un formulaire, aussi j'envisage d'utiliser une balise type "bbcode" du style:

Code : Tout sélectionner

[code=php]
etc....
[/code]

Pourriez-vous me guider pour la création du code qui me permettra de:

1. isoler ce qu'il y a entre les balises bbcode (c'est la chaine de caractère que je vais envoyé à GeShi pour qu'il me fasse la jolie coloration)
2. récupérer la chaine de caractère définissant le language ( entre = et ] ) (afin de l'envoyer aussi à GeShi pour qu'il sache quel modèle de coloration utiliser)

Enfin j'ai plus qu'à faire travailler GeShi:
<?php
$code = $_POST['code'];

/* Traitement de ma variable post afin de récupérer ce dont j'ai besoin 
* -> $code: contient le code envoyé
* -> $lang: contient le nom du langage 
*/

$geshi =& new GeSHi($code, $lang);
?>
Pour ce faire j'imagine qu'il faut que je passe par une expression régulière... Je dois demander à php de trouver ce qui est entre "[ code=XXX ]" et "[ /code ]", et au passage je dois récupérer "XXX" dans une variable.

Comment construire une telle expression? Et avec quelle fonction l'utiliser?

En résumé, je dis à php:

tu me colles dans une variable $code tout ce qui se trouve entre ces chaines de caractères (bbcode), et tu me colles dans une variable $lang le language défini à l'intérieur de la balise bbcode...

Jusque là ça va, je conçois que ça doit être faisable, mais par contre j'ai besoin d'un p'tit coup de pouce... pour la réalisation. :)

Ps: question secondaire: pourquoi y un & après le = lors de la création de l'objet GeShi?
$geshi =& new GeSHi($code, $lang);
Merci pour votre aide, et bon dimanche à tous!!
Probably (only a) Human Problem?

Eléphant du PHP | 447 Messages

18 juil. 2010, 09:02

Après avoir consulter la doc php, j'en suis venu à me tourner vers preg_match_all...

Quelque chose dans le style pourrait faire l'affaire:
<?php
$chaine = '[ code ]ceci est un test[ /code ]';
$pattern = '#\[code=(.+)\](.+)\[/code\]#';
preg_match_all($pattern, $chaine, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
?>
Je ne suis pas encore bien au clair...

EDIT:

Progression du travail:
if (isset($_POST['code'])) {
				
				$chaine = $_POST['code'];
				$pattern = '#\[code=(.+)\](.+)\[/code\]#';
				preg_match_all($pattern, $chaine, $matches, PREG_SET_ORDER);
				
				$nb = 0;
				
				include ('./geshi.php');
				
				foreach ($matches as $item) {
					
					$geshi =& new GeSHi($matches[$nb][2], $matches[$nb][1]);
					echo $geshi->parse_code();
					$nb++;
					
				}
				
			}
Probably (only a) Human Problem?

Eléphant du PHP | 447 Messages

18 juil. 2010, 11:20

Voilà une version de mon code qui fait quasiment ce que je veux... au détail près que si y a des sauts de lignes dans le code envoyé l'expression régulière ne semble plus faire son office!

Comment la modifier pour qu'elle tienne compte des sauts de ligne et des tabulations?
<?php
if (isset($_POST['code'])) {
				
	$chaine = nl2br(stripslashes($_POST['code']));
	$pattern = '#\[code=(.+)\](.+)\[/code\]#';
	preg_match_all($pattern, $chaine, $matches, PREG_SET_ORDER);
				
	$nb = 0;
				
	include ('./geshi.php');
				
	foreach ($matches as $item) {
					
		$geshi =& new GeSHi($matches[$nb][2], $matches[$nb][1]);
					
		$chaine = str_replace($matches[$nb][2], $geshi->parse_code(), $chaine);
	
		$chaine = str_replace('[code='.$matches[$nb][1].']', '<br /><small>Code '.$matches[$nb][1].':</small>', $chaine);
		$chaine = str_replace('[/code]', '', $chaine);
					
		$nb++;

	}
				
}
			
echo $chaine;
?>
Probably (only a) Human Problem?

Eléphant du PHP | 447 Messages

18 juil. 2010, 16:21

Bon... j'arrive toujours pas à résoudre ce problème de saut de ligne, et je pense que ça vient de ma regexp.... mais comment la modifier? là chuis paumé!

Si quelqu'un a une idée, chuis preneur. Merci d'avance!!
$pattern = '#\[code=(.+)\](.+)\[/code\]#';
C'est cette partie là qu'il faut modifier: (.+) (le 2ème, entre les deux balises codes)...
Probably (only a) Human Problem?

ViPHP
ViPHP | 5462 Messages

18 juil. 2010, 16:23


Eléphant du PHP | 447 Messages

18 juil. 2010, 16:31

Super! : )

Intéressant!!

Tu peux me donner un exemple comment ça s'utilise stp?

EDIT:

j'ai essayé comme ça:
$pattern = '#\[code=(.+)\](.+)\[/code\]#m';
mais ça marfe pas... :(
Probably (only a) Human Problem?

ViPHP
ViPHP | 5462 Messages

18 juil. 2010, 16:51

essaye tes pattern sur le site la http://gskinner.com/RegExr/
tu fais bien avec preg pas avec ereg ?

Eléphant du PHP | 447 Messages

18 juil. 2010, 17:06

Ouep avec preg! ;)

En farfouillant j'ai trouvé un truc intéressant sur le site du zéro: "isU", et ça marche comme ça...
$pattern = '#\[code=(.+)\](.+)\[/code\]#isU';
Probably (only a) Human Problem?

Eléphant du PHP | 447 Messages

21 juil. 2010, 05:42

Hellooo :)

quelqu'un pourrait-il me dire pourquoi y a un & devant le = dans ce bout de codounet:
$geshi =& new GeSHi($matches[$nb][2], $matches[$nb][1]);
Bonne journée à tous!
Probably (only a) Human Problem?

Frasq
Invité n'ayant pas de compte PHPfrance

06 avr. 2012, 01:18

Un autre article sur ce sujet : http://www.frasq.org/fr/coloration-synt ... rs-sources.
La fonction bbcode décrite est extraite de la librarie d’iZend – http://www.izend.org.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 avr. 2012, 06:58

21 mois plus tard j'espère qu'il a déjà une solution.....
Il en faut peu pour être heureux ......