04 07 2002 à 12:02 |
Je me suis fait un petit parser en PHP qui fait des troncatures. Mais ca foire un peu parce que j'ai mis une troncatures assez petite (17 car) pour que mon guestbook ne soit pas explosé par plus de 17 caracteres 'W' qui se suivent. Le probleme c'est avec les sauts de lignes. Si on tape Return a la fin d'une phrase et qu'on continue son texte sur la ligne suivante, le parser ne prendra pas le saut de ligne comme séparateur, car j'utilise la fonction explode($chaine, " ") (avec un espace comme séparateur donc) pour récupérer mes mots dans un tableau. Du coup le dernier mot de la ligne précédant le Return et le premier mot de la ligne suivant le Return ne feront qu'un, avec le caractere Return entre les deux. exemple : abcde fghijk sera pris comme "abcde[caractere Return]fghijk" et alors on arrive facilement a 17 caracteres avec ce truc et en général le mot suivant le Return est tronque en plein milieu... une solution serait, avant de faire un explode, de remplacer chaque return par un return+espace. mais quel caractere return utiliser ? \n ? \n\r ? comment utiliser la fonction str_replace ? j'ai essayé avec str_replace("\n", "\n ", $chaine); mais ca ne change rien... si vous pouviez m'aider... merci @+ |
|
04 07 2002 à 12:38 |
Après le htmlentities, et avant ta troncature tu fais un truc comme ça : $chaine = ereg_replace("\n"," <br> ",$chaine); Chez moi ça marche. |
|
04 07 2002 à 13:10 |
ah mais ca va pas si je fais le htmlentities avant la troncature... imagine l'expression suivante : "j'étais" elle prend 7 caracteres. Avec les htmlentities ca fait : "j'étais" ce qui fait 19 caracteres, du coup mon expression de 9 caracteres est tronquée apres le "a" (parce que je tronque a 17 caracteres) et c'est carrément pas bon ! moi je récupere ma chaine dans la base, je fais un stripslashes, puis un explode($chaine, " "), puis les troncatures, puis htmlentities, puis nl2br. donc ca ne résoud pas mon probleme. Il se peut que je m'y prenne vraiment mal aussi... merci quand meme |
|
04 07 2002 à 13:23 |
Ah oui, excuse moi, attent, essaye ça : $texte = ereg_replace("\n"," \n ",$texte); $texte = troncature($texte, "30"); // ta fonction troncature $texte = htmlentities($texte); $texte = nl2br($texte); J'ai essayé, ça marche bien. Enfin, je pense. |
|
04 07 2002 à 14:28 |
ben non, ca n'a pas l'air de marcher... Sous windozs les caracteres return sont en fait des \n\r non ? C'est peut-etre de la que ca foire ? |
|
04 07 2002 à 14:58 |
Essaye en virant le explode et le stripslashes. Pitetre que ça marchera. Sinon, je vois pas... faut attendre que quelqu'un qui gere en php reponde Bonne chance. |
|
04 07 2002 à 15:06 |
si je vire le explode et le stripslashes, je ne peux carrément plus rien faire mais t'inquiete, merci pour ton aide, je vais encore chercher un peu. @+ et merci |
|
04 07 2002 à 15:29 |
tiens je te donne (de tête mais ca doit être à peu pres ca) l'ordre des traitements de ta chaine : $chaine=str_replace("\n", " <br> ", "$chaine"); $tbMots = explode(" ", $chaine); $i=0; while ( $i <count($tbMots)) { if (strlen($mot)> 17)) { //FONCTION D'INSERTION D'ESPACE } } Voilou. dit-moi si c'est ce que tu cherches. @ + |
|
04 07 2002 à 15:41 |
dans l'ordre, je fais : o récupération de ma chaine : $chaine o stripslashes o explode($chaine, " ") o boucle sur les entrées du tableau et troncatures éventuellement (a la fin de chaque itération je reconstruis la chaine) o htmlentities o nl2br maintenant ce que je veux c'est ajouter un espace apres chaque retour a la ligne pour éviter le probleme cité plus haut. Cet ajout se fera entre le stripslashes et le explode. merci @+ |
|
04 07 2002 à 16:24 |
Oups excuses-moi ben vire ton htmlentities c de la daube, il convertit pleins de trucs inutilement. Tu fais une fonction qui convertit les entité html et qui rajoute des espaces devant... comme ca t'es pas emmerdé. ex : function Convertir($chaine) { $chaine=str_replace(" <", " <", "$chaine"); $chaine=str_replace("\t", " ", "$chaine"); $chaine=str_replace("\r", "", "$chaine"); etc ... Puis tes retours à la ligne : $chaine=str_replace("\n", " <br> ", "$chaine"); $chaine=str_replace(" <br> ", " <br> ", "$chaine"); // mettre espaces autour du <br> return $chaine; } apres tu fais ton traitement de césure. [edit] $chaine=str_replace(" <br> ", " <br> ", "$chaine"); // y'a pas d'espaces devant le premier <br> hein.. [edit] |
|
04 07 2002 à 16:35 |
ah ok d'accord, je comprends mieux. Je ne savais pas que htmlentities c'était pas recommandé. Pour les espaces avant <br> je sais que c'est le parser de piregwan qui en rajoute. merci bien !!! |
|
Pour répondre à ce sujet (et notifier automatiquement son auteur), cliquez sur le bouton REPONDRE A CE SUJET. Si vous voulez en plus avertir de votre réponse une personne qui a participé à ce sujet, cliquez sur le bouton en face de son intervention. Enfin si vous voulez inviter quelqu'un à réagir, utilisez les appeaux ci-dessous. Seuls les membres logués peuvent utiliser les appeaux et seuls les membres actifs peuvent être appeautés ^^. Bonne notification ! Vous n'êtes pas membre ou vous n'êtes pas logué(e) ou les appeaux sont désactivés dans votre profil. Vous ne pouvez pas utiliser les appeaux. |