[PHP] Fonction explode... à deux reprises

Fonction explode... à deux reprises [PHP] - PHP - Programmation

Marsh Posté le 16-06-2006 à 16:06:53    

Bonjour,
 
Voilà, j'ai besoin de parser deux fois une chaîne de caractères, qui est du type :
 
Lien1|Titre1*Lien2|Titre2*Lien3|Titre3 ... etc.
 
Le but étant au final d'avoir quelque chose du style :
<a href='Lien1'>Titre1</a>
<a href='Lien2'>Titre2</a>
<a href='Lien3'>Titre3</a>
etc...
 
Quelque chose du style ne fonctionne pas :  

Code :
  1. $liens=explode("*",$fliens);
  2.  $i=0;
  3.  while (isset($liens[$i])) {
  4.   $titre=explode("|",$liens[$i]);
  5.   echo $titre[$i]."<br>";
  6.  $i++;
  7.  }


 
Mais je ne comprends pas pourquoi pas... Là ça me renvoie : lien1 Titre2 :( .
Merci d'avance à l'éventuelle âme charitable qui saura m'aider ;)

Reply

Marsh Posté le 16-06-2006 à 16:06:53   

Reply

Marsh Posté le 16-06-2006 à 16:10:30    

Code :
  1. $liens=explode("*",$fliens); // exploser aux caractères '*'
  2. foreach($liens as $l) // parcourrir la liste en mettant l'élément courant dans <<$l>>
  3. {
  4.   // exploser au caractère '|', ranger les deux premiers éléments
  5.   // dans $lien et $titre
  6.   list($lien,$titre)=explode("|",$l);
  7.   // afficher, sans oublier htmlentities() au cas où les titres ou les liens
  8.   // contiendraient des accents
  9.   echo "<a href=\"".htmlentities($lien)."\">".htmlentities($titre))."</a><br>";
  10. }

Message cité 2 fois
Message édité par nargy le 16-06-2006 à 16:21:16
Reply

Marsh Posté le 16-06-2006 à 16:16:51    

nargy a écrit :

Code :
  1. $liens=explode("*",$fliens);
  2. foreach($liens as $l)
  3. {
  4.   list($lien,$titre)=explode("|",$l);
  5.   echo "<a href=\"".htmlentities($lien)."\">".htmlentities($titre))."</a><br>";
  6. }



Merci bien, ça fonctionne :)
Je n'aurais pas été contre une petite explication avec, mais je vais pas charrier, je m'en vais feuilleter le manuel PHP ... :D

Reply

Marsh Posté le 16-06-2006 à 16:21:31    

J'ai ajouté un commentaire, ci dessus.

Reply

Marsh Posté le 16-06-2006 à 16:25:14    

nargy a écrit :

sans oublier htmlentities() au cas où les titres ou les liens contiendraient des accents


Perdu !
 
htmlentities sert surtout à escaper les caractères genre <, >, & et " pour ne pas tout faire foirer. Après y'a les entités latin1, mais on s'en fout si on maîtrise l'encoding de la page. Dans ce cas, htmlspecialchars suffirait...


Message édité par FlorentG le 16-06-2006 à 16:25:23
Reply

Marsh Posté le 16-06-2006 à 16:31:47    

FlorentG> merci des précisions, je sais encore utiliser htmlentities(). Pour info, n'utilise jamais htmlspecialchars() si tu veux pas te retrouver avec un bug qui viendrait d'on se sait pas où un jour ou tu change la config de ton serveur.

Reply

Marsh Posté le 16-06-2006 à 16:34:23    

Pour en revenir à ton code, le problème vient de cette ligne:

Code :
  1. echo $titre[$i]."<br>";


 
Car la variable $i est incrémentée à chaque itération :

Code :
  1. $i = 0
  2. $titre[0] = Lien1  // {Lien1,Titre1}
  3. $i = 1
  4. $titre[1] = Titre2  // {Lien2, Titre2}
  5. $i = 2
  6. $titre[2] = ??  // {Lien3, Titre3}


 
Donc, faire attention quand on utilise la même variable pour plusieurs choses. :)

Reply

Marsh Posté le 16-06-2006 à 16:37:24    

nargy a écrit :

FlorentG> merci des précisions, je sais encore utiliser htmlentities(). Pour info, n'utilise jamais htmlspecialchars() si tu veux pas te retrouver avec un bug qui viendrait d'on se sait pas où un jour ou tu change la config de ton serveur.


HEINNNNNNNNNNNNNNNNNNNN ????
 
htmlentities réalise EXACTEMENT la même chose que htmlspecialchars, il encode juste en plus les entités latin1 (définies par la spec html4.01). Comme dit, si tu maîtrise ton encoding, pas besoin d'entités pour les caractères accentués. Et tout ça n'a rien à voir avec la config du serveur :(

Reply

Marsh Posté le 16-06-2006 à 16:40:46    

Bon, c'est fini là???? oui, le serveur utilise un encoding par défaut, oui, tu utilise un include() avec la définition de ton charset, et que si tu change pour avoir un site multilingue.......

Reply

Marsh Posté le 16-06-2006 à 16:42:16    

C'est pour ça que je fait tout en UTF-8 [:dawa] Et si jamais une page incluse est dans un autre charset, elle est converti à la volée en utf-8 ;)
 
Pour l'encoding par défaut, j'envoi aussi mes propres headers HTTP, donc plus de problème [:dawa]

Reply

Marsh Posté le 16-06-2006 à 16:42:16   

Reply

Marsh Posté le 16-06-2006 à 16:52:47    

Juste manière de faire l'enc*** de mouches...
 

Code :
  1. $liens = explode('*', $liens);
  2. for($i=0, $n=sizeof($liens); $i<$n; $i++) {
  3.    list($lien, $titre) = explode('|', $liens[$i]);
  4. }


 
Le for() est plus rapide et moins consommmateur de mémoire que le foreach...


---------------
♈ ♋ ♌ ♍ ♎ ♏ - Agora Fidelio | Galerie d'art Toulousaine
Reply

Marsh Posté le 16-06-2006 à 17:01:26    

On pourrait aussi utiliser une regexp [:dawa] Ca tient en une ligne

<?php
 
$str = 'Titre1*Lien1|Titre1*Lien2|Titre2*Lien3|';
 
echo preg_replace('/(.*)\*(.*)\|/eU', "'<a href=\"' . htmlspecialchars('\\2') . '\">' . htmlspecialchars('\\1') . '</a>' .\"\n\"", $str);


Reply

Marsh Posté le 16-06-2006 à 17:08:02    

Merci à tous pour vos précisions :)
 

Code :
  1. Le for() est plus rapide et moins consommmateur de mémoire que le foreach...


 
Je ne sais pas trop quoi penser en lisant ça. Ce n'est certes pas faux (enfin j'te fais confiance :D ), mais n'est-ce pas négligeable avec nos machines/serveurs actuel(le)s ?

Reply

Marsh Posté le 16-06-2006 à 17:34:33    

Ben tout dépend, c'est sur que sur un petit tableau le gain n'est pas vital ; c'est juste manière d'optimiser ce qui peut l'être facilement.


Message édité par j_lecruel le 16-06-2006 à 17:34:41

---------------
♈ ♋ ♌ ♍ ♎ ♏ - Agora Fidelio | Galerie d'art Toulousaine
Reply

Marsh Posté le 17-06-2006 à 09:29:31    

Et d'enculer les mouches :D

Reply

Sujets relatifs:

Leave a Replay

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