Besoin d'aide str_replace - foreach

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Besoin d'aide str_replace - foreach

Re: Besoin d'aide str_replace - foreach

par Akirami » 23 mai 2012, 16:34

Bon bah, j'y suis arrivé tout seul finalement même si je pense qu'il y a plus simple en php (encore plus en js), je poste le résultat ici des fois que cela puisse servir à quelqu'un d'autre :
$textes = $data[contenu];		
		$marqueurDebut = '<citation>';  //----------------------------------------------------ces 2 balises peuvent être modifier sans aucun autre changement 
		$marqueurFin = '</citation>';    //----------------------------------------------------------------------------------------------						
		if (preg_match($marqueurFin, $textes)){						
			function strpos_r($textos, $cita)  //----------------fonction permettant de retrouver les positions de toutes les balises, pas seulement la première
				{
				$pos_rec = array();
				while($seek = strrpos($textos, $cita))
					{
					array_push($pos_rec, $seek);
					$textos = substr($textos, 0, $seek);
				}
				return $pos_rec;
			}					
			$citation = preg_match_all($marqueurFin, $textes, $matches, PREG_PATTERN_ORDER);  //-------------On compte le nombre d’occurrence
			$deb []  = strpos_r( $textes, $marqueurDebut  ) ;          //---------------------------------------- la fonction détermine leurs positions     
			$fi [] = strpos_r( $textes, $marqueurFin ) ;                   //------------------------------------------------------------------------------------ 
			$dm = strlen ($marqueurDebut);
			for ($i=0; $i<$citation; $i++) {                                       //---------------------------------------Une boucle pour extruder le texte et le placer en tableau
				$textos[$i] = substr($textes, $deb[0][$i]+ $dm, ($fi[0][$i] - $deb[0][$i]) - $dm );
				$texto[$i] = htmlspecialchars( $textos[$i]);		//----------------------------On enlève le HTML				
                                $rev_textos = array_reverse($textos);                //---------------------------On inverse le sens des piles
				$rev_texto = array_reverse($texto);
                                $texte_final = str_replace( $rev_textos, $rev_texto ,$data[contenu]);//---On remplace dans le texte original
			}													
			echo  nl2br($texte_final);				//-------------------------------------------On affiche le tout

Voilà, donc ce script permet d'afficher du code source html qui aurait été saisi dans un input ou un textarea par exemple, il doit être positionner entre les 2 balises <citation> et </citation> (les balises peuvent être modifier à souhait).
Tout le reste du texte exécutera le HTML normalement.

AVERTISSEMENT : Il y a des fonctions php qui vont poser problème d'encodage suivant la configuration des serveurs (substr entre autre) !!!

Vous pouvez tout retrouver sur mon wiki : http://comptoir-du-net.fr/mediawiki/ind ... n_TEXTAREA

Re: Besoin d'aide str_replace - foreach

par Akirami » 22 mai 2012, 17:37

Peux-tu nous donner une exemple précis de ce que tu veux faire (chaine de caractères initiale + chaine de caractère finale) car j'ai un peu l'impression que tu ne vas pas au plus simple.
Merci,

Pour l'UTF-8, c'est réglé (même sans mb_substr, ça fonctionne impec).

je veux simplement pouvoir mettre du code au sein d'un article, par exemple lorsque je veux écrire pour mon article:
<video width="500" height="350" controls="controls">
<source src="/video/monfilm.mp4" type="video/mp4" />
<source src="/video/monfilm.webm" type="video/webm" />
<source src="/video/monfilm.theora.ogv" type="video/ogg" />
Contenu à afficher si le navigateur
ne supporte pas le l'élément vidéo.
</video>
je ne veux pas que ça m'affiche une vidéo mais le texte, pour cela dans ma console d'édition, je place une balise <citation></citation> avant et après le code à citer. :
<citation>
<video width="500" height="350" controls="controls">
<source src="/video/monfilm.mp4" type="video/mp4" />
<source src="/video/monfilm.webm" type="video/webm" />
<source src="/video/monfilm.theora.ogv" type="video/ogg" />
Contenu à afficher si le navigateur
ne supporte pas le l'élément vidéo.
</video>
</citation>
Avec ceci :
$textes = $data[contenu];
                       
                        $marqueurDebut = '<citation>';
                        $debut = strpos( $textes, $marqueurDebut ) + strlen( $marqueurDebut );                 
                        $marqueurFin = '</citation>';
                        $fin = strpos( $textes, $marqueurFin ) ;
                                               
                        $citation = preg_match_all ($marqueurFin, $textes, $matches, PREG_OFFSET_CAPTURE);                                                             
                        if (preg_match($marqueurDebut, $textes)){
                                $text = substr( $textes, $debut, $fin - $debut);                       
                                $texthtml = htmlspecialchars($text);
                                $cite = str_replace( "$text", "$texthtml",  $data[contenu]);
                                echo  nl2br($cite);
                        }
                        else {
                                $data[contenu] = nl2br($data[contenu]);
                                echo $data[contenu];
                        }
la première occurrence est bien modifiée lors de l'affichage, le code html n'est pas exécuté sur la partie balisée grâce à
$texthtml = htmlspecialchars($text);
mais pas les suivantes s'il y en a plusieurs dans ma page, pour cela je construis une boucle avec foreach mais je n'y arrive pas.

Re: Besoin d'aide str_replace - foreach

par AB » 22 mai 2012, 17:13


Pour faire simple, il s'agit de remplacer du code html/php/js qui aurait été posté dans un texte par leur affichage 'en clair dans une citation (un peu comme ici lorsque l'on utilise les balises).
Peux-tu nous donner une exemple précis de ce que tu veux faire (chaine de caractères initiale + chaine de caractère finale) car j'ai un peu l'impression que tu ne vas pas au plus simple.

EDIT: et fais attention si tu travaille en utf-8 car ton code utilises des fonctions non compatibles utf-8 (parfois cela ne pose pas de pb car les erreurs s'annulent mais c'est plus difficile à voir quand ces fonctions sont fréquemment utilisées dans le code).

Re: Besoin d'aide str_replace - foreach

par xTG » 22 mai 2012, 17:06

Une boucle cela itère... Donc là tu écrases ta variable à chaque itération.
Donc il est on ne peut plus normal de n'avoir qu'une seule valeur dedans à la fin.
Et ce n'est pas la première mais la dernière que tu retrouves dedans.

Construits un tableau et ajoutes tes résultats dedans à chaque itération.
A la fin de la boucle tu auras bien tout ton traitement.

Re: Besoin d'aide str_replace - foreach

par Akirami » 22 mai 2012, 16:49

Une boucle foreach travaille sur une copie du tableau. ;)
Pour modifier le tableau d'origine tu peux faire ainsi :
foreach($monTableau as $cle => $val)
  $monTableau[$cle] = 'nouvelle val';
Mon soucis est que je n’arrive pas à construire le tableau en question, je n'arrive qu'à faire sortir la première occurrence avec un var dump :
foreach ( $matches as $texthtml => $text) {
								
		$text = substr( $textes, $debut, $fin - $debut);                       
                $texthtml = htmlspecialchars($text);
                $cite = str_replace( "$text", "$texthtml",  $data[contenu]);			
		}				
	echo  nl2br($cite).'<br>';

Re: Besoin d'aide str_replace - foreach

par xTG » 22 mai 2012, 15:57

Une boucle foreach travaille sur une copie du tableau. ;)
Pour modifier le tableau d'origine tu peux faire ainsi :
foreach($monTableau as $cle => $val)
  $monTableau[$cle] = 'nouvelle val';

Besoin d'aide str_replace - foreach

par Akirami » 22 mai 2012, 15:55

Bonjour à tous,

Je m'arrache les cheveux depuis hier soir sur une boucle foreach sensé remplacer des morceaux de texte.

Pour faire simple, il s'agit de remplacer du code html/php/js qui aurait été posté dans un texte par leur affichage 'en clair dans une citation (un peu comme ici lorsque l'on utilise les balises).
$textes = $data[contenu];
			
			$marqueurDebut = '<citation>';
			$debut = strpos( $textes, $marqueurDebut ) + strlen( $marqueurDebut );			
			$marqueurFin = '</citation>';
			$fin = strpos( $textes, $marqueurFin ) ;
						
			$citation = preg_match_all ($marqueurFin, $textes, $matches, PREG_OFFSET_CAPTURE);								
			if (preg_match($marqueurDebut, $textes)){ 
				$text = substr( $textes, $debut, $fin - $debut);			
				$texthtml = htmlspecialchars($text);
				$cite = str_replace( "$text", "$texthtml",  $data[contenu]);
				echo  nl2br($cite);
			}
			else {
				$data[contenu] = nl2br($data[contenu]);
				echo $data[contenu];
			}
Ce code fonctionne très bien lorsqu'il n'y a qu'une seule occurrence à remplacer et c'est donc ici que j'ai voulu utiliser foreach :
 $textes = $data[contenu];
                $marqueurDebutLien = '<citation>';
		$debutLien = strpos( $data[contenu], $marqueurDebutLien ) + strlen( $marqueurDebutLien );			
		$marqueurFinLien = '</citation>';
		$finLien = strpos( $data[contenu], $marqueurFinLien ) ;				
						
		$citat = '</citation>';	
		
		$citation = preg_match_all($citat, $textes, $matches, PREG_OFFSET_CAPTURE);		
		if (preg_match($citat, $textes)){			
			foreach ( $citation as $leLien) {
								
				$leLien = substr( $textes, $debutLien, $finLien - $debutLien);			
				$texthtml = htmlspecialchars($leLien);
				$cite = str_replace( "$leLien", "$texthtml",  $data[contenu]);			
				}				
				echo  nl2br($cite);

El là bien évidement ce code ne fonctionne pas correctement, je cale, si vous pouviez éclairer ma lanterne, ce serait avec grand plaisir ;)