Page 1 sur 1

Php et preg replace avec liste xml [résolu]

Posté : 04 avr. 2010, 22:16
par fredsmn
Bonjour à tous,
voilà le soucis qui m'anène par ici.

Pour un site, j'utilise une galerie d'images simpleviewer. Pour rappel il s'agit d'un plugin photoshop qui crée une galerie d'images sous forme d'un flash qui se sert d'une playlist au format xml qui puise les images dans un dossier et les vignettes dans un autre dossier.
Voilà en gros à quoi ressemble cette playlist:

Code : Tout sélectionner

<image> <filename>nom_image_1</filename> <caption>titre_image_1</caption> </image> <image> <filename>nom_image_2</filename> <caption>titre_image_2</caption> </image> <image> <filename>nom_image_3</filename> <caption>titre_image_3</caption> </image>
J'ai alors imaginé un scrip php pour mettre à jour cette galerie d'image depuis le site directement. Cette mise à jour comporte deux parties, la première pour ajouter des images, la seconde pour en retirer.
Ce que fait le script:
Première partie: Upload d'une image, création de la vignette et stockage dans le dossier ad-hoc, et modification du fichier xml par ajout d'une chaine
	$ajout  = "<image> \n";
	$ajout .= "<filename>".$filename."</filename> \n";
	$ajout .= "<caption>".$caption."</caption> \n";
	$ajout .="</image> \n";

Je n'ai pas de problème a faire fonctionner cette première partie, si ça interesse quelqu'un, je peux fournir le script. C'est dans la seconde partie où je rencontre un problème. Si la supression physique des images et vignette ne me fait pas soucis, c'est la modification du fichier xml qui ne va pas.
En effet,

Il me faut retirer de ce fichier une chaine formée des caractères suivants

Code : Tout sélectionner

<image> <filename>nom_image</filename> <caption>titre_image</caption> </image>
Je suis partie sur l'idée d'employer preg_replace comme ceci:
	$retrait  = "/\b"; 
	$retrait .= "<image> \n";
	$retrait .= "<filename>".$filename."</filename> \n";
	$retrait .= "<caption>".$caption."</caption> \n";
	$retrait .="</image> \n";
	$retrait .= "\b/i";

je récupère le contenu de mon fichier xml dans la variable $page.
puis j'essaie de remplacer la chaine à retirer par une chaine vide ""

$newpage = preg_replace($retrait,"",$page);


Mais voilà, ça ne fonctionne pas, preg_replace me retourne une erreur "Unknown modifier '>'".... Il semble que les codes au format html me pose un problème et ne soit pas interprété par preg_replace. Quelqu'un aurait il une idée pour que que ça fonctionne, que je puisse retirer ce code xml de la page ?
avec ou sans preg replace...
Merci.


Au cas où, voici mon code:
	if (isset($_POST['supprimer']))
	{
		$fichier = $_POST['erase'];
		if (($fichier != ".") && ($fichier != "..")) { 
		echo "effacer :".$fichier; 
		// correction fichier xml
				$dir_xml = "../../job/gallerie/";
				$xml = $dir_xml."gallery.xml";
				$file=explode ("/", $fichier);
				$fichier = $file[5];
				
				$retire  = "<image> \n";
				$retire .= "<filename>".$fichier."</filename> \n";
				$retire .= "<caption></caption> \n";
				$retire .="</image> \n";
				
				if (is_file($xml)) {
					if (!$fp = fopen($xml,"r+")) {
						echo "Echec de l'ouverture du fichier";
					}
					else {
					if ($TabFich = file($xml)) {
					for($i = 0; $i < count($TabFich)-1; $i++)
					$page .= $TabFich[$i];
					}
					
					}
				
					fseek($fp,0); 
				fclose($fp); 
				}
				else {
				echo "erreur lecture fichier xml!";
				}
			echo nl2br(htmlentities($page))."<br><br><br><br>"; // Affiche la page complète pour vérifier
			
			
		 if ($page != "")
			 {
	
			 $char  = "/\b".nl2br(htmlentities($retire))."\b/i";
			 $newpage = preg_replace($char,"",nl2br(htmlentities($page)));
			 $page = $newpage;
			 }
			 }
			 echo nl2br(htmlentities($page)); // Affiche la page corrigée pour vérif.
			 echo "<br>";
		}


Re: Php et preg replace avec liste xml

Posté : 04 avr. 2010, 22:39
par Dr@ke
Tu utilises comme délimiteur ce caractère dans ta reg: / au début et /i à la fin.
Donc le caractère: /
Hors ce caractère est aussi présent dans les balises </image>, </caption> et </filename>.
Donc la fonction preg_replace() est perdue, ne pouvant plus s'y retrouver.
tu peux donc utiliser un autre caractère comme délimiteur, exemple celui-ci: #

Ps:
Tu peux aussi simplifier ta reg, pour ne pas utiliser des retour à la ligne ( \n ).

Re: Php et preg replace avec liste xml

Posté : 05 avr. 2010, 03:01
par stealth35

Re: Php et preg replace avec liste xml

Posté : 05 avr. 2010, 10:12
par Aureusms
Drake a raison fait attention a tes delimiteurs.
Cependant je te propose une autre approche : pourquoi ne régénères-tu pas ton fichier XML à la volée ? Cette approche m'a l'air plus simple.
Quand tu uploads avec ton script :
        $ajout  = "<image>  \n";
        $ajout .= "<filename>".$filename."</filename> \n";
        $ajout .= "<caption>".$caption."</caption> \n";
        $ajout .="</image> \n";
Tu n'a qu'à stocker dans un fichier csv, par exemple, que le $filename et $caption. Ensuite tu ouvres ce fichier csv et tu boucles avec un foreach. L'avantage est que tu n'aura pas traité ton fichier xml pendant son utilisation.

Re: Php et preg replace avec liste xml

Posté : 05 avr. 2010, 10:31
par fredsmn
Merci pour vos réponses.
Pour les délimiteurs, je ne savais pas encore qu'on pouvais faire avec plusieurs types. Ensuie, la class dom, je ne suis pas sûr qu'avec mon hebergement Free ça passe.

Pourquoi pas effecivement crée mon xml à la volée, en partant du contenu de mon dossier image, aprés avoir suprimer la dite image. Comme dans le cas présent je fait appel au même style de galerie, il me suffirait de conserver mon entête xml et ensuite d'y ajouter le code approprié
<image>
<filename>nom_image_1</filename>
<caption>titre_image_1</caption>
</image>
<image>
<filename>nom_image_2</filename>
<caption>titre_image_2</caption>
</image>
etc etc...


Pour le titre de l'image, soit on n'en met pas, soit on reprend le nom du fichier, soit on stocke dans une BDD, soit un fichier csv mais ça je ne connais pas encore.

Merci encore, je vous tiens au courant de l'évolution de la chose dans la semaine.

Re: Php et preg replace avec liste xml

Posté : 08 avr. 2010, 11:43
par fredsmn
Bonjour,

Chose promise, chose dûe, je suis de retour avec mes scripts, qui fonctionnent.
Simpleviewer permet d'avoir simplement et rapidement une Galerie d'images sur son espace web. Vous pouvez le téléchoper gratuitement à cette adresse:
simpleviewer
Pour en savoir plus sur son uilisation, je vous propose d'aller voir par ici:
tutorial

Pour ma femme j'ai fait un site avec une telle galerie. Il met alors venue l'idée de lui simplifier la tâche et d'eviter l'emploi d'un logiciel ftp ou encore de passer par photoshop pour modifier la dite galerie, et de lui permettre de gérer tout ça depuis un espace privé de son site.
Il est donc possible d'ajouter et de retirer des images une par une de la galerie. Pour celà, le script utilise deux techniques différentes, suivant que l'on veuille ajouter ou supprimer une image. Dans le premier cas, il ajoute les lignes ad-hoc à la playlist xml, et dans le second cas il reconstruit une playlist à partir des images restantes dans le dossier thumbs.

Le script construit également la vignette en tenant compte du format portrait ou paysage de l'image et conserve les proportions. Au moment de l'upload, les caractères interdits, espaces et autres sont retirés et remplacés.

L'ensemble comprend deux fichiers php, le premier est celui qui contient la fonction de scan des images présentes dans la galerie web. Cette fonction affiche sous forme d'un tableau les vignettes contenues dans le dossier thumbs. Chaque vingette est representé avec un bouton en X en dessous pour la supprimer. Le nombres de colonnes est modulable.

Quelques reflexions:

* On pourrait modifier le script pour reconstruire la playlist en fonction des dates de transfert des images sur le site pour conserver une chronologie.

* on pourrait aussi utiliser la technique de reconstruction de l'xml pour ajouer des images, cette fois aprés upload de l'image.

* Ici, j'ai fait au plus simple. Il n'y avait pas besoin de titre pour les images, j'ai laissé vide. Une solution simple pour donner un titre aux images serait de leur donner le même nom de fichier et d'en retirer l'extension. Exemple: Anniversaire_Cloe_2010.jpg --> Anniversaire_Cloe_2010
Si on veut aller plus loin dans ce domaine, il faudra envisager une BDD ou encore de passer par un fichier CSV.

* L'entête xml utilisé pour la reconstruction du fichier est celle que j'uilise pour ce site. Modifiez là suivant votre galerie.

Le script fonction.php
<?php
//	Fred  Simian
//	Module Fonctions pour gallerie simpleviewer
//       2010
//

function ScanThumbs($dir){
					$docu=0;
					$listfiles = array();
					$filesext = array('jpg','jpeg','png','gif',); // exensions permises
				
					if (substr($dir, -1, 1) !== '/') $dir .= '/'; // On vérifie que le dernier caractère de la chaîne "$dir" soit un "/" sinon on en ajoute un.
					if (is_dir($dir) AND ($dh = opendir($dir)) !== FALSE) { // On vérifie que la variable "$dir" indique un dossier et on l'ouvre dans la variable "$dh".
					
					while (($file = readdir($dh)) !== FALSE) { // On lit chaques fichiers.
					$temp = explode('.', $file); 
								
					for($t=0;$t<sizeof($filesext);$t++) // tant que $t est inferieur au nombre d'éléments du tableau... 
					{ 
						if (strtolower(end($temp)) === $filesext[$t]) {
						$listfiles[$docu] = $file; 
						$docu++;
						}
					} 
					}
				if (strtolower(end($temp)) === "pdf"){ $cible="_blank";} else { $cible="";}
				closedir($dh); // Quand le dossier a été lu, on le referme.
				
				sort($listfiles); // On trie les fichiers par leur clés.
				$temp = array_keys($listfiles); 

			if ($docu > 0){
						$i = -1;

						$Ncpt=0;
						echo '<table align=center>';
						
						while (isset($temp[++$i])) 
						{
						if ($Ncpt==0){echo '<tr>';}
						echo '<td align=center>';
						echo "<form action='upload.php' method='post'>";	
						echo '<img src="',$dir,$listfiles[$temp[$i]],'" >';
						echo '<br><input type="hidden" name="erase" value="'.$dir.$listfiles[$temp[$i]].'">
						<input type="hidden" name="alone" value="'.$listfiles[$temp[$i]].'">
						<input type="submit" name="supprimer" value="X"> ';
						echo '</form>';				
						echo '</td>';
						$Ncpt++;
						if ($Ncpt>4) { // Modifier le chiffre ici pour adaper le nombres de colonnes à votre  largeur de page. 
						$Ncpt=0; 
						echo '</tr>';
						}
						}
					
						echo '</table>';
						}
						else
							{	
						echo '<table align=center width="95%"><tr>
						<td valign=top align=center>Le dossier des images est vide.';

						echo '</td>
						</tr></table>';
						}		
				}
				else
				{
				echo '<table align=center width="95%"><tr>
						<td valign=top align=center>Le dossier des images est vide.';

						echo '</td>
						</tr></table>';
				}
}				
?>
Le script upload.php (gestion de la galerie)
<?php
// Fred. Simian
// Gestion d'une galerie d'image Simpleviewer
// en PHP
// 2010

// Compatible Hebergement Free

include ("fonction.php");
$numMo = 1; // Nombre de Mo autorisé par image pour le Upload.
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
		<title>Tes Simpleviewer</title>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

	</head>

<body>
	<!--                                                                                                      --->
	<!-- Entête de la page web                                                                --->
	<!--                                                                                                      --->
	
<?php
	//--> supression des images de la galerie
	if (isset($_POST['supprimer']))
	{
		$fichier = $_POST['erase'];
		if (($fichier != ".") && ($fichier != "..")) { 
		echo "effacer :".$fichier."<br>"; // verification.
		//Planté du décors
				$dir = "gallerie/"; // Dossier de la galerie
				$xml = $dir."gallery.xml"; // et nom du fichier xml à chercher
				
				$file=explode ("/", $fichier);
				$fichier_name = $file[5]; // On récupère le nom du fichier à retirer en le débarassant de son chemin complet.
				
				$vignette = $dir."thumbs/".$fichier_name; 
				$dir_thumbs = $dir."thumbs/";
				$image = $dir."images/".$fichier_name;
				
				// Effacer l'image et la vignette
				if (unlink($vignette) and unlink($image)) { 
				// Entete et pied du nouvel xml
		$entete_xml  = '<?xml version="1.0" encoding="UTF-8"?>'.chr(13);
		$entete_xml .= '<simpleviewerGallery maxImageWidth="480" maxImageHeight="400" textColor="0x181818" frameColor="0x555555" frameWidth="0" stagePadding="00" thumbnailColumns="1" thumbnailRows="4" navPosition="left" title="" enableRightClickOpen="false" backgroundImagePath="" imagePath="" thumbPath="">'.chr(13);
		$foot_xml = '</simpleviewerGallery>';
		
				$docu=0;
					$listfiles = array();
					$filesext = array('jpg','jpeg','png','gif');
				
					if (substr($dir_thumbs, -1, 1) !== '/') $dir_thumbs .= '/'; // On vérifie que le dernier caractère de la chaîne "$dir" soit un "/" sinon on en ajoute un.
					if (is_dir($dir_thumbs) AND ($dh = opendir($dir_thumbs)) !== FALSE) { 
					// On vérifie que la variable "$dir" indique un dossier et on l'ouvre dans la variable "$dh".
					
					while (($file = readdir($dh)) !== FALSE) { // On lit chaques fichiers.
					$temp = explode('.', $file); // recherche des extensions
								
					for($t=0;$t<sizeof($filesext);$t++) // tant que $t est inferieur au nombre d'éléments du tableau des extensions.
					{ 
						if (strtolower(end($temp)) === $filesext[$t]) {
						$listfiles[$docu] = $file; 
						$docu++;
						}
					} 
					}
				
				closedir($dh); // Quand le dossier a été lu, on le referme.
				
				sort($listfiles); // On trie les fichiers par leur clés.
			$temp = array_keys($listfiles); // On place la liste des fichiers trouvé dans une variable temp.
			if ($docu > 0){
			// On  trouvé au moins 1 fichier correspondant à la recherche.
						$i = -1;
						$ligne="";
						while (isset($temp[++$i])) 
						{
						$ligne .= "<image> \n";
						$ligne .= "<filename>".$listfiles[$temp[$i]]."</filename> \n";
						$ligne .= "<caption></caption> \n";
						$ligne .="</image> \n";					
						}
						$page = $entete_xml.$ligne.$foot_xml; // Le nouveau fichier xml
						
						$page = nl2br($page);
						$page = str_replace('<br />','',$page);
						
							if (!$fp = fopen($xml,"w")) {
							echo "Echec de l'ouverture du fichier";
							}
							else {
							fseek($fp,0); 
							fputs($fp,$page); 
					fclose($fp); 
					}
				}
				else
				{	
					echo '<table align=center width="95%"><tr>
					<td valign=top align=center>Le dossier des images est vide.';
					echo '</td></tr></table>';
				}		
				}
				else
				{
				echo '<table align=center width="95%"><tr>
						<td valign=top align=center>Le dossier des images n\'est ps valide.';
				echo '</td></tr></table>';
				}

		}
	else {
	echo '<table align=center width="95%"><tr><td valign=top align=center>Erreur fichier.';
	echo '</td></tr></table>';
		}
		}	 
	}

	switch($action_Acces) {

		case "Valider" : 
		
		$file_types_array = array('jpg','jpeg','gif','png');  // extensions acceptés.
		$taille_ko = (1024*1024)*$numMo; // poids maxi fichier ici 1mo multiplié par $numMo.
		
		$origfilename = $_FILES['userfile']['name'];  // Nom du fichier sur le disque utilisateur
		$taille = $_FILES['userfile']['size']; // taille du fichier
		
		$dir_vignette="../../job/gallerie/thumbs/";
		$dir ="../../job/gallerie/images/";
		
		// On retire les caractères inerdits pour un fichier.
		$origfilename = strtr($origfilename, 
					'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
					'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
					$origfilename = preg_replace('/([^.a-z0-9]+)/i', '', $origfilename);
		

		if ($taille <= $taille_ko){
			$temp = explode('.', $origfilename); // On "explose" le nom du fichier pour chaques "." trouvés.
			$file_ext = false;
			$ext= end($temp);
			for($i=0;$i<sizeof($file_types_array);$i++) // tant que $i est inferieur au nombre d'éléments du tableau... 
			{ 
				if (strtolower($ext) === $file_types_array[$i]) {
				$file_ext = true;
				}
			} 
	
			if ($file_ext == true) { 
					
				if (!copy($userfile, $dir."$origfilename")) { 
					print("<br>Probleme de transfert !<br>"); 
					} 
					else { 
					$dimension = getimagesize($dir.$origfilename);
					$Wsrc = $dimension[0];
					$Hsrc = $dimension[1];
			
				// ---> Création vignette
					if ($Wsrc > $Hsrc){
						$W=100;
						$H=round(100*($Hsrc/$Wsrc));
					}
					else {
						$H=100;
						$W=round(100*($Wsrc/$Hsrc));
					}
	
				$img_big = imagecreatefromjpeg($dir.$origfilename); # On ouvre l'image d'origine 
				$img_new = imagecreatetruecolor($W, $H); 
				# création de la miniature 
				$img_mini = imagecreatetruecolor($W, $H); 

				// copie de l'image, avec le redimensionnement. 
				imagecopyresized($img_mini,$img_big,0,0,0,0,$W,$H,$dimension[0],$dimension[1]); 

				imagejpeg($img_mini,$dir_vignette.$origfilename ); 
	
				// modif du fichier xml par ajout d'une série de ligne.
				$dir_xml = "../../job/gallerie/";
				$Fichier = $dir_xml."gallery.xml";
				
				$ajout  = "<image> \n";
				$ajout .= "<filename>".$origfilename."</filename> \n";
				$ajout .= "<caption></caption> \n";
				$ajout .="</image> \n";
				$ajout .="</simpleviewerGallery> \n";
				if (is_file($Fichier)) {
					if (!$fp = fopen($Fichier,"r+")) {
						echo "Echec de l'ouverture du fichier";
					}
					else {
					if ($TabFich = file($Fichier)) {
					for($i = 0; $i < count($TabFich)-1; $i++)
					$page .= $TabFich[$i];
					}

					}
					$page = $page.$ajout;

					fseek($fp,0); 
					fputs($fp,$page); 
				fclose($fp); 
				}
				else {
				echo "erreur lecture fichier xml!";
				}
	
			echo "<font color=green face=arial>L'image a été enregistrée !</font>"; 

			} 
			} else {
				echo "extension non reconnue";
			}			
		} else {
		echo "Le fichier est trop volumineux";
		}
	
		
			default: // FORMULAIRE D UPLOAD

					echo '<table width="95%" border="0" align="left"  bgcolor="#BEB69F" style="margin-top:8px;border:1px solid green;">';
					echo "<tr><th colspan=2 ><font face='arial' color='black'> Upload d'images<br>(maxi: $numMo mo)<br></font></th></tr>";
	
					print("<FORM ENCTYPE=\"multipart/form-data\" ACTION=\"upload.php\" METHOD=\"post\">"); 
						// Chassis
						
					
					echo "<tr><td colspan=2 align=center>";
					
					print("<INPUT NAME=\"userfile\" TYPE=\"file\" value=\"$userfile\" size=\"40\">"); 
				?>
				</td></tr><tr><th colspan=2>
				<INPUT TYPE="submit" NAME="action_Acces" VALUE="Valider">
				</form></th></tr>

			<?php										
			echo '</td></tr>';						
			echo '</table>';
			}
			?>

<div id="dessous" style="margin-top:3px; clear:both;"></div>


			
<?php
// TABLEAU DES IMAGES PRESENTES DANS LA GALLERIE. APPEL DE LA FONCTION  ScanThumbs ("dossier des vignettes")
echo '<table cellspacing=1 cellpadding=0 width="95%" align=left" style="border:1px solid orange;">';

echo '<tr><td valign=top>';
	ScanThumbs("gallerie/thumbs/");
echo '</td></tr>';
echo '<tr height="4px"><td></td></tr>';
echo '</table>';
echo '<div id="dessous" style="clear:both;"></div>';	
			
			?>
	<!--                                                                                                      --->
	<!-- Pied de la page web                                                                    --->
	<!--                                                                                                      --->

</body>
</html>	

Voilà,
bonne journée,
Fred