8797 sujets

Développement web côté serveur, CMS

Bonjour,

à l'aide d'un petit script je récupère des emails et les copies dans un fichier .xml mais j'ai un problème avec la fonction preg_replace. J'arrive pas à trouver comment faire que pour tout nouveau paragraphe ou retour à la ligne le texte soit placé entre <p></p>.

J'ai beau chercher sur google, il est spammer du manuel de php.net par d'autre sites rendant les recherches frustantes.

Merci d'avance
Je peux t'aider mais je n'ai pas très très bien compris ce que tu veux faire avec cette fonction. Concrêtement, qu'est-ce que tu veux remplacer et par quoi ?

Tes retours à la ligne sont des caractères HTML (<br> ou <br />) ou bien des caractères du genre \r\n ou \n ?

Ca devrait ressembler à peu près à ça :
$email=preg_replace('/(\r\n)+/','</p><p>','<p>'.trim($email).'</p>);
(mon code est un peu condensé...disont optimisé, mais je peux le détailler et t'expliquer s'il convient)
Modifié par 84mickael (01 Aug 2005 - 00:50)
Si j'ai bien compris tu as un texte de ce genre :
a écrit :

Blabla ... Blabla ... Blabla ... Blabla ... Blabla ... Blabla ...
Plop ... Plop ... Plop ... Plop ... Plop ... Plop ... Plop ... Plop ...
Blabla ... Blabla ... Blabla ... Blabla ... Blabla ... Blabla ...

Et tu veux avoir :
a écrit :

<p>Blabla ... Blabla ... Blabla ... Blabla ... Blabla ... Blabla ...</p>
<p>Plop ... Plop ... Plop ... Plop ... Plop ... Plop ... Plop ... Plop ...</p>
<p>Blabla ... Blabla ... Blabla ... Blabla ... Blabla ... Blabla ...</p>

En admetant que tu recuperes dans $chaine le contenu de ton mail et que cette chaine soit composée de plusieurs lignes de texte dont les retours a la ligne sont des \n voila un code qui marchera :

preg_replace('#^(.+)$#im'  ,  '<p>\1</p>'  ,  $chaine);
afbilou a écrit :
preg_replace('#^(.+)$#im' , '<p>\1</p>' , $chaine);
Bonne idée ! J'écrirais ça comme ça d'ailleurs (chacun a sa manière de faire pour les regexp je crois) :
preg_replace('/^(.+)$/m','<p>\\1</p>',$chaine);

Modifié par 84mickael (01 Aug 2005 - 01:24)
Merci pour vos réponses, cela fonctionne très bien sauf que il y a des <p><p/> sans contenu lors de chaque retour à la ligne donc j'ai regardé pour du <br />


$message[1] = preg_replace("/\n/", "<br />", trim($message[1]));


Tout ça est impec, tout est bien enregistré dans le fichier .xml sauf que pour une raison que je comprend pas tout les x charactères il fait un retour à la ligne (que ce soit text brute ou html dans le mail) comme vous pouvez le voir ici. J'ai beau chercher dans le code mais je trouve rien qui pourrait provoquer ça. Si vous voulez jetez un coup d'oeil au code source.

Merci encore
Modifié par Valhala (01 Aug 2005 - 10:52)
Valhala a écrit :
Merci pour vos réponses, cela fonctionne très bien sauf que il y a des <p><p/> sans contenu lors de chaque retour à la ligne

Tu as testé avec quel code ? Le premier code de 84mickael ?
Valhala a écrit :
pour une raison que je comprend pas tout les x charactères il fait un retour à la ligne (que ce soit text brute ou html dans le mail)

C'est tous à fait normal dans le corp d'un E-mail en effet, la spécification qui définit le format des e-mail limite la taille maximal d'une chaine de caractère, audela de la quel elle doit être tronqué par un retour à la ligne (\n)

> http://fr.php.net/manual/fr/function.chunk-split.php
> http://www.faqs.org/rfcs/rfc2045.html
> http://www.faqs.org/rfcs/rfc1844.html

Smiley cligne
<p></p> [paragraphe vide] apparait quand il y a une ligne composée uniquement de caracteres blancs comme des espaces ou des tabulations.

Pour remédier a ca essaie ca :
preg_replace('#^\s*(.+?)\s*$#m', '<p>\1</p>', $texte)

Ca devrait regler ton probleme de maniere elegante Smiley smile
Merci Afbilou, s'est impec.

Jep, si j'ai bien compris je sais rien y changer alors ? Dommage Smiley decu

Merci encore pour votre aide, j'aurais pu tourner en rond pendant des heures sur google.