Page 1 sur 1

Pb Expressions régulières !

Posté : 21 janv. 2006, 13:33
par didgar
Salut !

Pour les besoins d'un projet perso je suis en train de "m'amuser" à développer une messagerie interne. Façon MP de PHPBB. J'ai d'ailleurs essayer de comprendre la mécanique utilisée par PHPBB et ... j'ai un peu de mal ;-)

Voici le postulat de départ :

Code : Tout sélectionner

$texte='[quote="toto"][quote="titi"] Salut ! Ceci est un test ! titi[/quote] Ceci est la réponse au test ! toto[/quote] Ceci est la réponse à la réponse ! titi';
J'arrive à supprimer les

Code : Tout sélectionner

[quote=""]
et les

Code : Tout sélectionner

[/quote]
et donc à isoler les noms d'auteur et les messages en faisant ça [ rigolez-pas ! je pense qu'il y a plus simple mais bon ... ] :
$chars = preg_replace('/\[quote="|"\]|\[\/quote]/',"",$texte);
echo '<pre>';
print_r($chars);
echo '</pre>';
Ce que je voudrais faire c'est traiter $texte une première fois pour ne récupérer que les noms des auteurs dans l'ordre et traiter une seconde fois $texte pour récuper le message associé à un auteur.

Si quelqu'un a une soluce ... il est d'ailleurs peut-être possible de tout traiter en une seule fois ? J'avoue, je n'utilise les expressions régulières que tous les 120 ans donc j'ai un peu de mal ... Peut-être même les expressions régulières ne sont pas la solution ?

Voilà !

Passez un bon WE !

A+

Didier

Posté : 22 janv. 2006, 03:05
par didgar
Salut !

Ne vous cassez plus la tête, j'ai réussi.

Voici comment j'ai procédé si ça vous branche ;-)
<?php
$texte='[quote="toto"][quote="titi"]

Salut !

Ceci est un test !

titi[/quote]

Ceci est la réponse au test !

toto[/quote]

Ceci est la réponse à la réponse !

titi'; // ça c'est le texte récupéré de la bdd

preg_match_all("|"(.*)"|U",$texte,$out,PREG_PATTERN_ORDER); // voir php.net c'est bien expliqué ! Ca me sert à recuperer ce qui est entre double quote à savoir le nom des auteurs des messages - je m'en sers plus loin pour fabriquer le bbcode à la volée


   $bbcode=array(
   '[quote]' => '<div class="citation">',   
   '[/quote]' => '</div>',
   '[b]' => '<strong>',
   '[/b]' => '</strong>',
   '[i]' => '<em>',
   '[/i]' => '</em>',
   '[u]' => '<u>',
   '[/u]' => '</u>'
   ); // fabrication d'un tableau associatif bbcode => motif de remplacement

// depuis que j'ai édité mon message, il apparait une série de chr précédés de ':' dans mon tableau $bbcode - ne pas en tenir compte //


for($i=0;$i<count($out[1]);$i++)
{
	$bbcode["[quote="".$out[1][$i].""]" ] = "<span class='auteur'>".$out[1][$i]." a écrit :</span><div class='citation'>"; // fabrication à la volée du bbcode et du motif de remplacement qui vont bien ;-)
}


$test_string = str_replace(array_keys($bbcode), array_values($bbcode), $texte); // on remplace les bbcode par leur motif respectif si besoin

echo nl2br($test_string); // on affiche et c'est terrible !

?>
Et une 'tite capture du résultat :

Image

Si un puriste a une meilleure méthode ça m'intéresse.

Bonne fin de WE.

A+

Didier

Posté : 23 janv. 2006, 13:02
par didgar
Salut !

Pas de puriste pour m'indiquer une meilleure méthode ???

A+

Didier

Posté : 26 nov. 2006, 14:13
par DeNice
Salut Didier !
Alors j'ai bossé sur le truc, et pis en fait je me suis rendu compte que ben voilà en fait ça passe tout seul sans le preg_match_all();

Voici ma soluce (seulement pour les citations) :
$objet = preg_replace('#\[c=(.*?)\]#', '<div class="auteurCitation">Citation de $1</div><table width="95%" class="tabCitation" align="center"><tr><td class="citation">', $objet);
$objet = str_replace('[/c]', '</td></tr></table>', $objet);
Oilou ;) N'hésitez pas à commenter !

++

-DeNice-

Posté : 26 nov. 2006, 23:00
par didgar
Salut !

@DeNice J'ai testé [ uniquement pour des citations ] ta soluce et effectivement, ça fonctionne. Je trouve juste l'imbrication de balise un peu cavalière mais qui s'en soucie :-* :lol: :lol:

A+

Didier