Comment tronquer un texte tout en préservant les balises html?

Comment tronquer un texte tout en préservant les balises html? - PHP - Programmation

Marsh Posté le 27-05-2007 à 11:35:59    

Bonjour,
 
J'ai un texte relativement long à tronquer. Le texte est truffé de balises html et le script que j'ai trouvé sur le net ne préserve pas les balises.
 
Exemple :
 
Mon texte d'origine :

Code :
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Cras nisl nibh</strong>, mattis a, mattis gravida, varius luctus, est. Praesent id leo ut pede sagittis ullamcorper


 
Après tronquage :

Code :
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Cras nisl

 
 
L'idéal serait d'avoir :

Code :
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Cras nisl nibh</strong>


 
 
Voici le script que j'utilise :

Code :
  1. <?
  2. $max= 30; // on détermine combien de caractères maxi doit avoir le texte.
  3. if (strlen($texte)>$max) // la longueur du texte est-elle supèrieure à limite $max ?
  4. {
  5. $texte = substr($texte, 0, $max); // on tronque le texte avec comme limite le maximum de caractères autorisés.
  6. $espace = strrpos($texte, " " ); // Récupération du dernier espace pour ne pas couper un mot.
  7. $texte = substr($texte, 0, $espace); // la phrase est reformatée pour s'arrêter à l'éspace .
  8. $texte = $texte."..."; // on ajoute des points de suspension
  9. }
  10. else
  11. {
  12. echo $texte ; // sinon on affiche simplement le texte }
  13. ?>


 
Comment dois-je m'y prendre pour que le script prenne en compte les balises?
 
Merci de votre aide :hello:

Reply

Marsh Posté le 27-05-2007 à 11:35:59   

Reply

Marsh Posté le 27-05-2007 à 13:24:17    

Une idée serait, à mon avis, de rechercher la
dernière occurence du caractère "<" dans ta
chaîne.
 
Ici, ce serait le "<" du "<strong>" (caractère 58) de :

Code :
  1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Cras nisl


Bon, donc tu sais que le dernier "<", c'est le 58.
Tu regardes le caractère 59.
Oh ! C'est un "s" !!! Ce n'est donc pas un "\"...
La balise n'est donc pas fermée.
 
Du coup, tu cherches le caractère ">" qui suit le
58e. Ici, c'est le 65e (à la fin du "<strong>" ).
 
Tu copies cette chaîne (du 58 au 65) à la fin  
de ta chaîne en ajoutant un "\"...
 
Bon, je connais pas trop le PHP, mais le code  
ressemblerait à ça en VB (à toi de transposer ! :-D)
 

Code :
  1. ch = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <strong>Cras nisl"
  2. <!-- On cherche le dernier "<" -->
  3. For i = Len(ch) To 1 Step -1
  4.    If Mid(Ch, i, 1) = "<" then
  5.       PosDeb = i
  6.       Exit For
  7.    End If
  8. Next i
  9. <!-- Si le caractère suivant est un "/", c'est bon, on arrête -->
  10. If Mid(Ch, PosDeb + 1, 1) = "/" Then End
  11. <!-- Sinon, on cherche le ">" qui suit -->
  12. For i = PosDeb To Len(Ch)
  13.    If Mid(Ch, i, 1) = ">" Then
  14.       PosFin = i
  15.       Exit For
  16.    End if
  17. Next i
  18. <!-- On récupère le texte (ici Strong) -->
  19. Texte = Mid(Ch, PosDeb + 1, PosFin - PosDeb)
  20. <!-- On rajoute la balise de fermeture -->
  21. Ch = Ch + "<\" + Texte + ">"


Voilà, voilà !!! J'espère que ça va t'aider !
 
Alors là, le problème de cette méthode, c'est qu'elle
ne marche pas dans trois cas :
1. <balise1><balise2>Mon texte</balise1>
2. <balise1><balise2>Mon texte
3. <balise1>Mon texte</ba


Message édité par Profil supprimé le 27-05-2007 à 13:28:26
Reply

Marsh Posté le 27-05-2007 à 13:55:45    

Je ne sais malheureusement pas transposer du vb en php. N'y a-t-il pas plus simple et un peu moins long?

Reply

Marsh Posté le 27-05-2007 à 14:30:47    

- Tu lis le texte  
- A chaque balise ouvrante rencontrée, tu la mets sur le dessus d'une pile  
- A chaque balise fermante rencontrée tu retire la balise ouvrante de la pile
 
Au moment ou tu veux arreter le texte, tu balance tout ce que t'as sur la pile en fermant les balises...
 
Problème : Le html doit absolument etre bien formaté (pas de balise orpheline), mais ca peut s'arranger en vérifiant à chaque balise fermante qu'elle ferme bien la dernière balise de la pile, etc.

Reply

Sujets relatifs:

Leave a Replay

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