Page 1 sur 1

substr et retour chariot

Posté : 17 oct. 2008, 12:48
par Flashball
Bonjour,

J'aimerais couper une chaine de caractère à un nombre max de caractères. J'utilise actuellement:

Code : Tout sélectionner

$text = substr($text, 0, ($maxChar - 1));
Problème: les retours à la ligne comptent apparemment pour 2 caractères, et celà fausse donc la "coupe".

Existe-t-il une solution simple ou dois-je passer par un algo lourdaud? :?

Posté : 17 oct. 2008, 13:29
par Berzemus
et du côté wordwrap() ?

Posté : 17 oct. 2008, 15:00
par fab
as t'il un caractère au moins que tu es de ne jamais avoir dans ? :) genre <
dans ces cas là tu remplaces tes retour à la ligne par des <
 $text = str_replace('\n','<',$text); 
et après tu fais ta découpe :) et ensuite tu fais un replace inverse :)

Sinon est-ce vraiment grave une erreur d'un caractère ? :)

Posté : 17 oct. 2008, 18:35
par Flashball
Merci pour vos réponses!

d'après mes tests, "wordwrap" ne convient pas car il repère et coupe les mots en tant qu'ensemble

et pour l'astuce de fab, j'y avais pensé brièvement mais c'est pas très très propre, on n'est jamais sûr à 100% que certains caractères ne seront pas utilisés... :)

j'ai quand même testé et je me suis aperçu que le str_replace('\n', 'test', $text) ne remplaçait rien du tout: mon retour-chariot n'est pas codé avec '\n' on dirait... J'utilise des pages en UTF-8 et un IDE configuré en UTF-8. Les caractères sont récupérés à partir d'une Modalbox.

J'ai aussi testé le remplacement de '\n\r' et '\u240D' mais rien à faire... :roll:

Posté : 17 oct. 2008, 22:16
par Berzemus
j'ai quand même testé et je me suis aperçu que le str_replace('\n', 'test', $text) ne remplaçait rien du tout: mon retour-chariot n'est pas codé avec '\n' on dirait...
Bien sur que si. Tu dois juste utiliser des doubles apostrophes (") et pas des simples ('), sinon php n'interprète pas \n comme un retour à la ligne, mais comme ce qu'il est, \n. Fab a fait une petite erreur, c'est tout.
$text = str_replace("\n","<",$text);
Et personnellement j'utiliserais un autre symbole pour démarquer le saut la ligne, comme la barre | .

Posté : 22 oct. 2008, 14:58
par Flashball
Merci pour votre aide.

Voici finalement le bout de code qui marche:

Code : Tout sélectionner

$text = str_replace("\r\n","|",$text);

Posté : 22 oct. 2008, 15:38
par Berzemus
Merci pour votre aide.

Voici finalement le bout de code qui marche:

Code : Tout sélectionner

$text = str_replace("\r\n","|",$text);
utilise ceci plutôt:
$text = str_replace("\r\n|\n","|",$text);
L'encodage des retours à la ligne peut dépendre des plateformes et des navigateurs (enfin, ça dépend d'où vient le texte au départ).