Partage
  • Partager sur Facebook
  • Partager sur Twitter

preg_replace dans un foreach

Sujet résolu
    20 juillet 2018 à 14:28:38

    Bonjour à tous !

    Je reviens encore une fois pour un problème concernant un site en locale. Il y a quelque temps j'étais venu ici pour vous faire part d'un autre problème.

    Pour faire court, je suis au boulot, je monte un site en local sans passer par bdd (restriction oblige..), donc je passe par du unserialize. (c'est sympa à faire :P)

    J'ai pratiquement fini mon projet (faire une base de connaissance version WEB, au lieu de passer par un excel tout naze) et tout ça sans pouvoir le partager par http/ip (partage par installation de Devserver sur le C: sur chaque post voulu + batch de récupération des données vers un répertoire).

    Mon problème actuel, c'est que pour que certains membre du personnel puissent accéder à ce projet, j'ai mon système d'upload qui upload les images sur un autre disque dur (qui lui est partagé à tous le monde (ici le V:).

    j'ai réussi à trouver un moyen pour récupérer ses fameuses images pour les afficher (bbcodes + encodage de l'image), mais mon problème c'est que lors de l'affichage, je suis censé récupérer toutes les images, Or actuellement je n'arrive qu'a récupérer que la première image de chaque post.

    Chaque "Posté ressemble à ceci:

    ------------------------------------

    Titre : Blablabla

    Contenu :
    Blabla, c'est du blabla

    Il faut faire ça pour le blabla [img]avis1.png[/img] et puis ça [img]avis2.png[/img]

    --------------------------------------

    A ce stade, je réussi bien à importer mon image et l'afficher. Sauf qu'avec mon système de bbcode et de réencodage de l'image bah je n'obtient pas :

     [img]avis1.png[/img]  [img]avis2.png[/img]

    Mais :

     [img]avis1.png[/img]  [img]avis1.png[/img]

    Je n'arrive pas à comprendre pourquoi ...

    Mon fichier pour récupérer chaque "News" :

    <div class="site">
      <div class="site-main">
    	<?php include("header.php"); ?>	
    		<div class="column-layout">
    			<?php
    				$liste_news = unserialize(file_get_contents('V:\WP\BDC\bdc.txt'));
    				if(!empty($liste_news)) {
    				$i = 1;
    				$count = 1;
    
    				foreach($liste_news as $id => $news) {
    					$news = array_map('htmlspecialchars', $news);
    					
    					$titre = array();
    						// lister les titre
    						if (!in_array($news['titre'], $titre)) {
    							$titre[] = $news['titre']; 
    						}
    
    						if(in_array("de", $news ))
    						{
    							include("bbcode_parser.php");
    						?>
    						
    				
    						<div id="list_ticket">
    						<div id="compte_ticket"><?php echo $count++;?></div>
    							<div id="<?php echo $i++; ?>" class="titre_ticket">
    								<img src="./img/joker.png" align="absmiddle"/>
    								<?php echo '&nbsp;' . $news['titre'] ?>
    								<div id="link">
    									<a class="tab_link" href="supprimer_news.php?id=<?php echo $id ?>" onclick="return confirm('Etes-vous s&ucirc;r de vouloir supprimer ce ticket ?');"><img src="./img/delete.png" width="12px" height="12px"></a>
    								</div>
    								<div id="link">
    									<a class="tab_link" href="editer_news.php?id=<?php echo $id ?>"><img src="./img/edit.png" width="12px"/></a>
    								</div>
    							</div>
    
    							<div id="cat" style="display:none;"><?php echo $news['categorie'] ?></div>
    							<div id="contenu"><?php echo convert($news['contenu']); ?></div>
    						</div>
    						<?php
    						}
    				}
    
    			}
    			else {
    				echo 'Il n\'y a aucun ticket pour le moment.<br />';
    			}
    			?> 
    
    
    		</div>	
    	</div>
    </div>
    <?php include("footer.php"); ?>

    Mon fichier de bbcode (bbcode_parser.php) pour extraire les images de l'autre DD :

    	if(strpos($news['contenu'], '[img]')) {
    		preg_match('`\[img](.*)\[/img]`U', $news['contenu'], $resultat);
    
    		$image = file_get_contents('V:/WP/BDC/uploads/'.$resultat[1].'');
    
    		$image_codes = base64_encode($image);
    				
    		$debut_image = '<image src="data:image/jpg;charset=utf-8;base64,';
    				
    		$fin_image = '" alt="$1"/>';
    		$news = preg_replace('#\[img\](.+)\[\/img\]#iUs', $debut_image . $image_codes . $fin_image, $news);
    	}

    Comment faire pour avoir un affichage des bonne images ?

    Je suppose qu'il faut utiliser un :

    preg_match_all('`\[img](.*)\[/img]`U', $news['contenu'], $resultat);

    Mais pour le reste, je sèche.

    Merci d'avance pour votre aide !

    Cordialement, 

    Wilfried.

    -
    Edité par HalCroves 23 juillet 2018 à 10:32:30

    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2018 à 10:55:27

      Bonjour, 

      Je me permets de faire remonter ce sujet.

      J'ai bien avancer, j'arriver à récupérer mes images séparément grâce à un foreach !

      if(strpos($news['contenu'], '[img]')) {
      	
      	// Cherche les occurences
          preg_match_all('`\[img](.*)\[/img]`U', $news['contenu'], $resultat, PREG_PATTERN_ORDER);
      
          foreach($resultat[1] as $nb_image)
          {
      		// On récupére l'image
              $image = file_get_contents('V:/WP/BDC/uploads/'.$nb_image.'');
      		
      		// on encode l'image
      		$image_codes = base64_encode($image);
      				
      		$debut_image = '<image src="data:image/jpg;charset=utf-8;base64,';
      				
      		$fin_image = '" alt="$1"/>';
      		
      		// echo '<pre style="background: #ccc; border : 1px solid;">';
      		// print_r($nb_image);
      		// echo '</pre>';
       		$news = preg_replace('#\[img\](.+)\[\/img\]#iUs', $debut_image . $image_codes . $fin_image, $news, 1);
      	
          }
      
      }	

      -----------------------------------

      EDIT :

      You are actually replacing all the [img]...[/img] tags during the first iteration of the loop, so there is nothing to replace when the next iteration starts.

      You could utilize the count argument for preg_replace:

      count If specified, this variable will be filled with the number of replacements done.

      So your replace becomes:

      $news = preg_replace('#\[img\](.+)\[\/img\]#iUs', $debut_image . $image_codes . $fin_image, $news, 1);
      
      

      Cordialement.

      -
      Edité par HalCroves 23 juillet 2018 à 11:15:29

      • Partager sur Facebook
      • Partager sur Twitter

      preg_replace dans un foreach

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown