Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Couper une phrase sans couper les mots

7 réponses
Avatar
Sebastien
Bonjour,

Je cherche à afficher seulement une partie d'une chaîne extraite d'une
base de données (ou toute autre source). Je veux récupérer uniquement x
caractères mais sans couper de mot et surtout (c'est ce qui me pose
problème) sans risquer de couper des entités HTML du genre & ou des
références numériques comme  .

Comment savoir si on coupe un mot ou une entité à x caractères ? En
particulier les entités ne sont pas forcemment limitées par des espaces :
http://exemple.com?var1=value1&var2=value2

Je suis sûr que quelqu'un a déjà été confornté au problème, mais y
a-t-il une solution qui prennet en compte ces cas de figure ?

Sébastien

7 réponses

Avatar
Olivier Miakinen

Je cherche à afficher seulement une partie d'une chaîne extraite d'une
base de données (ou toute autre source). Je veux récupérer uniquement x
caractères mais sans couper de mot et surtout (c'est ce qui me pose
problème) sans risquer de couper des entités HTML du genre & ou des
références numériques comme  .


Ne suffit-il pas de couper au dernier caractère rencontré (avant x),
parmi " " et "&" ? Comme il n'y a pas d'espace dans les entités HTML
numériques ou symboliques, ça devrait faire ce que tu veux.

Cela posé, le choix de la méthode (preg_replace ou substr+strrpos ou
quoi que ce soit d'autre) est plutôt indifférent.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
dwojylac.nospam
Sebastien wrote:

Je cherche à afficher seulement une partie d'une chaîne extraite d'une
base de données (ou toute autre source). Je veux récupérer uniquement x
caractères mais sans couper de mot et surtout (c'est ce qui me pose
problème) sans risquer de couper des entités HTML du genre & ou des
références numériques comme  .


Une fonction que j'utilise

function trunc_text($text, $nchars, $delim = '.') {
if ($nchars < strlen($text)){
$n = strpos($text, $delim, $nchars);
if ($n !== false) {
$text = substr($text, 0, $n+1);
}
}
return $text;
}

$text ta chaine à tronquer
$nchars, le nombre de caractères voulus
$delim le délimiteur sur lequel se fait la coupure (le point par défaut)

les entités html ne comportant pas d'espace elles ne seront pas
tronquées, cependant tu peux avoir des questions de fermeture de balise
comme par exemple si ta chaine à tronquer coomporte une séquence du
style ... <b>des mots et d'autres</b> ... et que la coupure se fait
entre les balises <b> et </b>

--
Dominique Wojylac
http://wojylac.free.fr

Avatar
Sebastien
Merci Dominique, ça fait très bien l'affaire pour moi.

les entités html ne comportant pas d'espace elles ne seront pas
tronquées, cependant tu peux avoir des questions de fermeture de balise
comme par exemple si ta chaine à tronquer coomporte une séquence du
style ... <b>des mots et d'autres</b> ... et que la coupure se fait
entre les balises <b> et </b>


Je n'ai pas ce problème, il s'agit de contenu brut qui a été vérifié
lors de l'insertion dans la BDD avec un htmlspecialchars(), donc il n'y
a pas à proprement parler de balises dans le texte. Mais effectivement
ça doit pas mal compliquer l'histoire...

D'ailleurs je suis toujours à la recherche d'un script permettant de
valider une chaîne en HTML par rapport à un ensemble d'éléments
autorisés et d'attributs autorisés par élément. Mais c'est une autre
histoire...

Sébastien

Avatar
John Gallet
Bonjour,

Je cherche à afficher seulement une partie d'une chaîne extraite d'une
base de données (ou toute autre source). Je veux récupérer uniquement x
caractères mais sans couper de mot
Jusqu'ici la fonction native de PHP devrait faire le boulot.


et surtout (c'est ce qui me pose
problème) sans risquer de couper des entités HTML du genre &amp; ou des
références numériques comme &#160;.
S'ils sont pas trop manchots ils y auront pensé, à tester.


Cf http://fr2.php.net/manual/en/function.wordwrap.php

a++;
JG

Avatar
Sebastien
Cf http://fr2.php.net/manual/en/function.wordwrap.php


Ce n'est pas vraiment ce que je cherche à faire. J'ai une chaîne dont je
ne veux afficher que x mots.

Sébastien

Avatar
John Gallet
Cf http://fr2.php.net/manual/en/function.wordwrap.php
Ce n'est pas vraiment ce que je cherche à faire. J'ai une chaîne dont

je ne veux afficher que x mots.


Ce n'est pas ce qui était demandé dans l'article d'origine...

Je veux récupérer uniquement x caractères mais sans couper de mot



JG


Avatar
Olivier Miakinen

Cf http://fr2.php.net/manual/en/function.wordwrap.php


Ce n'est pas vraiment ce que je cherche à faire. J'ai une chaîne dont je
ne veux afficher que x mots.


Note que si tu as utilisé wordwrap avec un caractère donné (par exemple
"n") tu peux toujours, ensuite, rechercher ce caractère dans la chaîne
pour la tronquer à cet endroit-là.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)