preg_match_all et preg_replace avec des balises imbriquées

preg_match_all et preg_replace avec des balises imbriquées - PHP - Programmation

Marsh Posté le 17-12-2007 à 16:52:11    

Salut :)
 
Je suis en train (d'essayer) de me faire un p'tit moteur de template very light et je bute sur un probleme assez bete :/
 
J'ai par exemple ce bout de code :

Code :
  1. texte ici
  2. <bloc_1>je suis dans le bloc 1
  3. <bloc_2>Je suis dans le bloc 2
  4.  <bloc_3>Je suis dans le bloc 3</bloc_3>
  5.  Je suis sorti du bloc 3
  6. </bloc_2>
  7. Je suis sorti du bloc 2
  8. <bloc_4>
  9.  je suis dans le bloc 4
  10. <bloc_4>
  11. </bloc_1>
  12. Je suis sorti du bloc 1


 
et j'ai fait ce bout de class :

Code :
  1. class template_blocs {
  2. private $str ;
  3. private $hide = array() ;
  4. function __construct( $str )
  5. {
  6.  $this->str = $str ;
  7. }
  8. public function hideBlock( $block_idt )
  9. {
  10.  $this->hide[] = $block_idt ;
  11. }
  12. private function cleanTemplate()
  13. {
  14.  if( sizeof( $this->hide ) > 0 )
  15.  {
  16.   foreach( $this->hide as $bloc_id )
  17.   {
  18.    //echo "|<bloc_".$bloc_id.">([^>]+)<\/bloc_".$bloc_id.">|Usm<br />" ;
  19.    $this->str = preg_replace( "|<bloc_".$bloc_id.">(.*)<\/bloc_".$bloc_id.">|Usm" , "" , $this->str );
  20.   }
  21.  }
  22.  preg_match_all( "|<bloc_([^>]*)>(.*)<\/bloc_\\1>|Usm" , $this->str , $out );
  23.  while( count( $out[1] ) > 0 )
  24.  {
  25.   $this->str = preg_replace( "|<bloc_".$out[1][0].">([^>]+)<\/bloc_".$out[1][0].">|Usm" , "\$1" , $this->str );
  26.   preg_match_all( "|<bloc_([^>]*)>([^>]+)<\/bloc_\\1>|Usm" , $this->str , $out );
  27.  }
  28. }
  29. function getHtml()
  30. {
  31.  $this->cleanTemplate() ;
  32.  return $this->str ;
  33. }
  34. }


Le but c'est de dire je cache le bloc ayant l'id 3 et ca squizera automatiquement <bloc_3>........</bloc_3>
Et quand le bloc est conservé, juste oter les balises.
 
Le souci c'est que ca march un peu comme ca veux : Quand a un niveau on n'a qu'un bloc tout va bien mais quand par exemple dans le bloc 1 j'ai le bloc 2 et 4, ben tout pars en live !
Y aurait-il un spécialiste suceptible de m'expliquer ce qui cloche svp :) ?

Reply

Marsh Posté le 17-12-2007 à 16:52:11   

Reply

Marsh Posté le 17-12-2007 à 16:55:30    

Les regexps ne sont pas super-faites pour ce genre de cas, avec des trucs récursifs. Change de méthode :(

Reply

Marsh Posté le 17-12-2007 à 16:58:51    

Ben a part ca je vois pas quoi utiliser d'autre :/
En fait j'ai trouvé le problème, j'ai mal fermé le bloc 4 :whistle:

Reply

Sujets relatifs:

Leave a Replay

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