OVH Cloud OVH Cloud

tokenize ou explode : probleme de CR et LF

2 réponses
Avatar
Sebastien
Re-bonjour,

Je cherche à transformer des sauts de lignes en éléments P en HTML.

Je ne sais pas si le texte contient des sauts de ligne sous forme CR, LF
ou CRLF, donc j'ai fait une fonction utilisant strtok()

<?php
function cr_to_para($str)
{
$tok = strtok($str, "\r\n");
$paras = '';
while ($tok)
{
$paras .= '<p>'.$tok.'</p>'."\r\n\r\n";
$tok = strtok("\n\t");
}
return $paras;
}
?>

Le problème comme vous vous en doutez est que lorsque que le saut de
ligne est un CRLF, des paragraphes "vides" sont créés.

La parade que j'ai trouvé est de vérifier le contenu du token à chaque
itération

<?php
function cr_to_para($str)
{
$tok = strtok($str, "\r\n");
$paras = '';
while ($tok)
{
if(!empty($tok) && $tok != "\r" && $tok != "\n")
{
$paras .= '<p>'.$tok.'</p>'."\r\n\r\n";
}
$tok = strtok("\n\t");
}
return $paras;
}
?>

Je ne trouve pas cette solution très élégante et je me demande si
quelque chose ne risque pas de passer au travers.

D'autre part j'ai essayé avec un explode() et cela semble fonctionner
mais comme on ne peut passer qu'un paramètre (si j'ai bien compris),
j'ai choisi "\r\n". Il semble que ça passe avec un contenu saisi sous
Mac comme sous PC, mais ça m'étonne.

Exemple avec explode() :

<?php
function cr_to_para($str)
{
$pieces = explode("\r\n", $str);

$paras = '';
foreach($pieces as $para)
{
if(!empty($para) && $para != "\r" && $para != "\n")
{
$paras .= '<p>'.$para.'</p>'."\r\n\r\n";
}
}
return $paras;
}
?>

Quelle est la meilleure méthode à votre avis ? J'opterais pour strtok...


Sébastien

2 réponses

Avatar
Olivier Miakinen

Je cherche à transformer des sauts de lignes en éléments P en HTML.

Je ne sais pas si le texte contient des sauts de ligne sous forme CR, LF
ou CRLF, [...]


Eh bien le mieux serait de faire en sorte de le savoir :


/* Les sauts de lignes peuvent être CR, LF ou CRLF */

$str = str_replace("rn", "n", $str);

/* Maintenant cela peut être CR ou LF */

$str = str_replace("r", "n", $str);

/* Voilà, il n'y a plus que des LF */

--
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
Sebastien

Eh bien le mieux serait de faire en sorte de le savoir


D'oh !!!

Merci Olivier !

J'ai conservé la fonction utilisant strtok().

<?php
function cr_to_para($str)
{
$str = str_replace("rn", "n", $str);
$str = str_replace("r", "n", $str);

$tok = strtok($str, "n");
$paras = '';
while($tok)
{
$tok = trim($tok);
if(!empty($tok))
{
$paras .= '<p>'.$tok.'</p>'."rnrn";
}
$tok = strtok("n");
}
return $paras;
}
?>

Ca marche comme un charme pour moi !

Des suggestions ?