8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'espère que je poste au bon endroit, c'est mon premier post. Bon voila, j'ai un projet d'application web dans lequel on utilise des templates qui sont utilisés pour l'affichage.
donc un fichier template nommé layout.php

A l'interieur de ce fichier on peut definir des blocs de ce genre:

[%bblock nom_du_bloc %]

ensuite je peut avoir un fichier editer.view.php dans lequel j'appel le layout définit. A l'interieur de editer.view.php je peux avoir aussi des blocs de ce genre:

[%bblock nom_du_bloc %]
--on met du javascritp ou du html ou tu texte ou les trois-->
[%eblock%>

les noms de bloc doivent correspondre dans les deux fichiers.

l'idée est de parser le fichier layout.php et de remplacer tous les [%bblock nom_du_bloc %] par le contenu qui se trouve entre les blocs [%bblock nom_du_bloc %][%eblock%] se situant dans editer.view.php portant le même nom de blocs.

J'ai utiliser les expression regulieres de cette facon:

$pattern_central="[\w<>\.\/'\"=\s\[\]\éàù\$\^*\\\#();%]";
$pattern="/\[%bblock \s*([\w]+)\s*%\](".$pattern_central.")\[%eblock%\]/i";


Cela marche sauf qu'il prend le premier [%bblock] et le dernier [%eblock%] qui se trouve dans editer.view.php en incluant les autres [%bblock][%eblock%]. Au final, je n'ai pas plusieurs ligne de block mais une seule:


preg_match_all($pattern,"[%bblock d1%]<br><br><br>[%eblock%]" .
		"[%bblock d2%]salut[%eblock%]" .
		"[%bblock d3 %]<b>lit</b>* \#(); ] 100% % ['<a href='../lien'>lien</a>[%eblock%]" .
		"[%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%]" .
		"[%bblock d5%][toto][%eblock%]" 
	   ,$blocks,PREG_SET_ORDER);



résultat avec un var_dump($blocks):

array
  0 => 
    array
      0 => string '[%bblock d1%]<br><br><br>[%eblock%][%bblock d2%]salut[%eblock%][%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%][%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%][%bblock d5%][toto][%eblock%]' (length=244)
      1 => string 'd1' (length=2)
      2 => string '<br><br><br>[%eblock%][%bblock d2%]salut[%eblock%][%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%][%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%][%bblock d5%][toto]' (length=221)


j'ai le nom en indice 1 et le contenu de mon $2 qui contient les autres bblock et eblock.

si j'enlève le % en fin de mon $pattern_central (ci dessus, plus haut)ca marche sauf que je ne peux plus utiliser de %, sinon il trouve que le caractère n'est pas prise en compte.
essai sans le %:

array
  0 => 
    array
      0 => string '[%bblock d1%]<br><br><br>[%eblock%]' (length=35)
      1 => string 'd1' (length=2)
      2 => string '<br><br><br>' (length=12)
  1 => 
    array
      0 => string '[%bblock d2%]salut[%eblock%]' (length=28)
      1 => string 'd2' (length=2)
      2 => string 'salut' (length=5)
  2 => 
    array
      0 => string '[%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%]' (length=79)
      1 => string 'd3' (length=2)
      2 => string '<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>' (length=55)
  3 => 
    array
      0 => string '[%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%]' (length=73)
      1 => string 'd4' (length=2)
      2 => string '<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>' (length=50)
  4 => 
    array
      0 => string '[%bblock d5%][toto][%eblock%]' (length=29)
      1 => string 'd5' (length=2)
      2 => string '[toto]' (length=6)


En gros c'est un système de ce genre que je veux faire à savoir:
parser le fichier layout.php et de remplacer tous les [%bblock nom_du_bloc %] par le contenu qui se trouve entre les blocs [%bblock nom_du_bloc %][%eblock%]se situant dans editer.view.php portant le même nom de blocs.Que ce contenu soit du un melange de tag html,javascrip,css ou pas, et sans que je ne soit obligé d'eviter de saisir certains caractères

Est-ce possible?

Si je suis sur la mauvaise piste, indiquez moi le bon chemin.
S'il y a une autre façon de gérer ce genre de script (a savoir remplacer une balise par le contenu d'une autre, enfin un truc de ce genre), plus simplement, je suis preneur.

C'est en php.

Merci d'avance
Modifié par sajreborn (18 Nov 2012 - 15:37)
Modérateur
Salut et bienvenue,

J'ai lu ton code en Z et je ne vois pas l’intérêt de passer par des RegEx.

strtr() ou str_replace()

Toujours choisir le plus simple. A vue de nez, j'ai l'impression que tu te casses la tête.

Au passage, les éléments br à répétition, b, etc. c'est pas terrible. CSS is better forever

Pour un système de templating (Ça évitera de réinventer la roue):
pear
smarty
Modifié par niuxe (18 Nov 2012 - 16:24)
Merci de m'avoir repondu. Je ne vois pas comment utiliser ta soluce.

En gros, je dois recueillir dans un tableau tout ce qui se trouve entre toutes les balises blocks rencontées (soit le nom et le contenu) qui se trouvent dans un fichier par exemple edit.php

ensuite je parcours le tableau precedent ou se trouve le nom de mes templates et leur contenu et je parse le template layout.php, et je verifie tout les block ayant tel nom qui se trouve dans le block, alors il le remplace par le contenu correspodant.

J'espere que j'ai bien expliqué.

Sincerement je vois pas comment utiliser ta soluce.
mais je vais essayer. Si je comprend ce que tu veux dire, je cherche d'abord a partir des fonction strstr et strpos mes balises [%bblock nom%] et des que je trouve un debut de [%bblock, alors je copie tout ce qui suit jusqu'au %] ainsi j'ai le nom et je commence a faire pareil pour récupérer le contenu jusqu'au prochain [%eblock%]. Ainsi j'ai récupérer tout son contenu?

En attendant ta réponse, je vais tester cette algo, merci, et tiens moi au courant, si je suis pas en Amazonie?


 	private function parseBlock($string){
 		$BLOCK_BEGIN_L_SIZE=8;//[%bblock
 		$BLOCK_BEGIN_R_SIZE=2;//[%bblock
 		$BLOCK_END_SIZE=10;//[%eblock%]
 		
 		$curpos=0;
		$isfind=true;
		$blocks=array();
		$i=0;
		while ($isfind!=false){			 		
			$block_name_pos1=stripos($string,"[%bblock",$curpos);
			if($block_name_pos1!==false){
				$block_name_pos2=stripos($string,"%]",$block_name_pos1);
				$block_name=trim(substr($string,$block_name_pos1+$BLOCK_BEGIN_L_SIZE,$block_name_pos2-$block_name_pos1-$BLOCK_BEGIN_L_SIZE));
				foreach($blocks as $block){
					if(array_search($block_name,$block)!==false){
						die("Erreur: la vue: <b><i>".$this->view."</i></b> contient au moins deux blocs identiques de nom:<b><i>".$block_name."</i></b>");
					}
				}
				$blocks[$i][0]=$block_name;
					 		
				$curpos=$block_name_pos2+$BLOCK_BEGIN_R_SIZE;
					 		
				$block_content_pos1=stripos($string,"[%eblock%]",$curpos);
				$block_content=substr($string,$block_name_pos2+$BLOCK_BEGIN_R_SIZE,$block_content_pos1-$block_name_pos2-$BLOCK_BEGIN_R_SIZE);
				$blocks[$i][1]=$block_content;
					 		
				$curpos=$block_content_pos1+$BLOCK_END_SIZE;
				$i++;
			}else{
				$isfind=false;
			}				 		
		}
		return $blocks;
 	}


Suite à ta proposition, j'ai donc revu un peu le code et il est affiché ci-dessus et il marche correctement ! (je sais pas si il est optimisé, mais ca marche).

MErci
Modifié par sajreborn (18 Nov 2012 - 22:09)
Modérateur
Attention, je ne t'ai pas parlé de strstr(), mais de strtr(). C'est totalement différent.

php.net a écrit :
strstr(string $haystack , mixed $needle [, bool $before_needle = false ]) — Trouve la première occurrence dans une chaîne

php.net a écrit :
strtr(string $str , string $from , string $to) ou strtr ( string $str , array $replace_pairs ) — Remplace des caractères dans une chaîne

Perso, je pense que je serai parti sur un str_replace(). Cependant, je ne connais pas le tenant et l'aboutissant de ton code. Enfin, je veux dire je ne sais pas comment arrive tes données. C'est la raison pour laquelle je t'ai suggéré les deux fonctions qui sont de toutes manières appropriées à ton soucis.
Modifié par niuxe (19 Nov 2012 - 00:44)