8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un petit soucis avec un script...

en gros, j'ai un texte (qui contient des balises <b>, <i> ou <s> et je n'en prends que les 200 premiers caractères que j'affiche...

Or, si une balise est ouverte à un endroit, il se peut qu'elle ne soit fermée qu'après les fatidiques 200 caractères...

Ce qui fait que tout texte qui suit se retrouve ou en gras, ou en iltalic, ou souligné... puisque la balise n'est pas fermée!

j'ai pensé à fermer les balises par défaut mais ça ne parait pas très propre...

existe-t-il une solution élégante de gérer la chose? tester si le texte contient telle ou telle balise et le traiter en fonction en rajoutant les balises?

Par avance merci...
Pour moi, la solution passe par une syntaxe de type Jade que l'on compile ensuite en html via Grunt ou un autre task runer.
Modérateur
Salut,

Olivier C a écrit :
Pour moi, la solution passe par une syntaxe de type Jade que l'on compile ensuite en html via Grunt ou un autre task runer.

NodeJS en herbe....
Heu non. Perte de temps et ne répond pas au problème Smiley cligne

Habituellement, j'utilise ceci avec la méthode truncate : http://api.cakephp.org/2.6/class-TextHelper.html

Je me doute que tu n'utilises pas du tout, les mêmes outils que moi.

Partant du nom de la méthode et d'une recherche un peu plus poussée sur glouglou, tu obtiens ce genre de résultat :
php truncate string keep html

Le 1er lien te donne quelque chose d'intéressant apparemment :
http://alanwhipple.com/2011/05/25/php-truncate-string-preserving-html-tags-words/

<<<EDIT
D'ailleurs, l'auteur de l'article annonce qu'il s'inspire de Cakephp.

Tu as un souci de script, mais sur quel langage ? J'ai regardé le forum et nous sommes techno serveur, alors je t'ai donné une solution php. Si besoin faut l'adapter suivant le langage. Dans l'article, il y a un commentaire où il y a une solution Java
EDIT;
Modifié par niuxe (15 Jul 2015 - 19:06)
Effectivement, Niuxe a raison, je ne répond pas à la question... Sans doute trop occupé à regarder les phoques d'Océanopolis en même temps que je répondais à ce topic!

Pour revenir sur la question: le mieux serait peut-être de filtrer toutes les balises via une regex ou une fonction php afin de les retirer. En effet, quel intérêt peut avoir un texte en gras ou en italique si de toute façon une partie est tronquée.
Modifié par Olivier C (15 Jul 2015 - 19:57)
Modérateur
Olivier C a écrit :
le mieux serait peut-être de filtrer toutes les balises via une regex ou une fonction php afin de les retirer. En effet, quel intérêt peut avoir un texte en gras ou en italique si de toute façon une partie est tronquée.

Je te rassure, la regex peut être évitée et de ce fait, ce sera plus performant.
strip_tags()
Modifié par niuxe (16 Jul 2015 - 13:38)
Je pense effectivement qu'il vaut mieux supprimer les balises avant de tronquer.

Cependant, si supprimer les balises n'est pas désiré, la solution la plus fiable passe probablement par des fragments DOM.

Une petite idée en pseudo-code :

function truncate (fragment, length):
return truncateRecursive(fragment, length, 0)
end function

function truncateRecursive (node, length, curLength) :
If node is a text node, then:
curLength += node.length
if curLength < length, then return curLength
else:
node.data = node.data.substring(0, length + curLength - node.length)
return length
end if
end if
For each child N of node, do:
if curLength>=length, then remove N from node
else curLength = truncateRecursive(N, length, curLength)
end for
return curLength
end function