couper une chaine html sans couper de tags

couper une chaine html sans couper de tags - PHP - Programmation

Marsh Posté le 14-04-2006 à 21:55:20    

Bonjour,
 
 
J'ai actuellement dans un champ de type text sous mysql (provenant d'un cms), des infos au format html.
Je cherche à afficher une partie (genre les 200 1ers mots) de ces champs de manière correcte, en gardant les balises images.
Utiliser striptags+substr ne convient pas car je peux me trouver au milieu d'un tag html autorisé (img dans moncas).
J'ai essayé de récupérer le dernier "mot" avant la césure en mode texte, puis d'effectuer la césure sur le résultat précédent en mode html sans résultat convaincant.
 
Si jamais quelqun'un a une idée pour faire ca le plus simplement possible....
 
Merci.

Reply

Marsh Posté le 14-04-2006 à 21:55:20   

Reply

Marsh Posté le 14-04-2006 à 23:12:21    

> des infos au format html.
pas bien ;)
 
ho ho simplement ça va pas être possible.
une grosse expression régulière est la solution.

Reply

Marsh Posté le 14-04-2006 à 23:40:59    

Merci de ta réponse,
 
je teste en expression régulière, mais je ne vois pas de solution...
En cliar je veux essayer de recupérer la mise en forme (tant que possible) et couper quel que soient les balises utilisées dans la création du code.  
Je suis en traine d'essayer tidy (j'ai la main sur le serveur), pour avoir un code valide après le substr, mais ca ne marche pas si je coupe en plein milieu des attributs d'un tag...

Reply

Marsh Posté le 14-04-2006 à 23:55:59    

ok, donnes moi une liste de tags valides que tu accepte dans ta chaîne

Reply

Marsh Posté le 15-04-2006 à 16:04:35    

Pour l'instant juste les tags img

Reply

Marsh Posté le 15-04-2006 à 16:46:06    

les 200er mots incluent-ils les tags?

Reply

Marsh Posté le 15-04-2006 à 16:46:15    

ha oui, j'avais oublié: utilise xml_parse()

Reply

Marsh Posté le 15-04-2006 à 16:46:58    

ou alors un truc du genre:

Code :
  1. function couper($chaine, $nbmots)
  2. {
  3.   $n=0;
  4.   $res="";
  5.   while(1)
  6.   {
  7.     // trouver le début de premier tag:
  8.     $debut_tag=strpos($chaine,'<');
  9.     // sinon prendretoute la chaine
  10.     if($debut_tag==false) $debut_tag=strlen($chaine);
  11.     // copier le morceau de texte
  12.     $tmp=substr($chaine,0,$debut_tag);
  13.     // couper par mots
  14.     $mots=split($tmp, "[ \t\r\n]" );
  15.     // ajouter les mots au résultat
  16.     for($i=0;$i<count($mots) && $n<$nbmots;$i++,$n++)
  17.       $res.=($n?" ":"" ).$mots[$i];
  18.     // vérifier si on a atteind le nombre max de mots
  19.     if ($n>=$nbmots) return $res;
  20.     // couper la chaine
  21.     $chaine=substr($chaine,$debut_tag);
  22.     // vérifier si on a atteind la fin de la chaine
  23.     if (strlen($chaine)==0) return $res;
  24.     // trouver la fin du tag
  25.     $fin_tag=strpos($chaine,'>');
  26.     // sinon erreur de fin de tag, retourner chaîne vide
  27.     if($fin_tag==false) return "";
  28.     // copier tag
  29.     $res.=substr($chaine, 0, $fin_tag+1);
  30.     // ajouter un mot
  31.     $n++;
  32.     // vérifier si on a atteind le nombre max de mots
  33.     if ($n>=$nbmots) return $res;
  34.     // couper la chaine
  35.     $chaine=substr($chaine,$fin_tag+1);
  36.   } 
  37. }


Message édité par nargy le 15-04-2006 à 16:47:46
Reply

Marsh Posté le 16-04-2006 à 15:27:05    

Hello,
merci à tous. Je n'ai pas trop la possibilité de tester les méthodes proposées ce we.
La méthode de nargy, parser les chars 1 à 1 me semble être le plus fonctionnelle pour mon cas.
Je renvoie de l'info dès que possible...

Reply

Sujets relatifs:

Leave a Replay

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