42 votes

Remplacer plusieurs nouvelles lignes, tabulations et espaces

Je souhaite remplacer plusieurs caractères de retour à la ligne par un seul caractère de retour à la ligne, et plusieurs espaces par un seul espace.

J'ai essayé preg_replace("/\n\n+/", "\n", $text); et a échoué !

Je fais également ce travail sur $text pour le formatage.

$text = wordwrap($text, 120, '<br/>', true);
$text = nl2br($text);

$text est un grand texte pris de l'utilisateur pour BLOG, et pour un meilleur formatage j'utilise wordwrap.

67voto

Francois Deschenes Points 15809

En théorie, votre expression régulière fonctionne, mais le problème est que tous les systèmes d'exploitation et les navigateurs n'envoient pas seulement des \n à la fin de la chaîne. Beaucoup d'entre eux enverront également un \r.

Essayez :

J'ai simplifié celui-ci :

preg_replace("/(\r?\n){2,}/", "\n\n", $text);

Et pour résoudre le problème de l'envoi de certains \r seulement :

preg_replace("/[\r\n]{2,}/", "\n\n", $text);

Sur la base de votre mise à jour :

// Replace multiple (one ore more) line breaks with a single one.
$text = preg_replace("/[\r\n]+/", "\n", $text);

$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);

42voto

Armel Larcier Points 5391

Utilice \R (qui représente n'importe quelle séquence de fin de ligne) :

$str = preg_replace('#\R+#', '</p><p>', $str);

Il a été trouvé ici : Remplacement de deux nouvelles lignes par des balises de paragraphe

Documentation PHP sur Séquences d'évasion :

\R (saut de ligne : matches \n , \r y \r\n )

11voto

Sonny Points 3453

Voici la réponse, telle que je comprends la question :

// Normalize newlines
preg_replace('/(\r\n|\r|\n)+/', "\n", $text);
// Replace whitespace characters with a single space
preg_replace('/\s+/', ' ', $text);

Il s'agit de la fonction que j'utilise pour convertir les nouvelles lignes en éléments HTML de retour à la ligne et de paragraphe :

/**
 *
 * @param string $string
 * @return string
 */
function nl2html($text)
{
    return '<p>' . preg_replace(array('/(\r\n\r\n|\r\r|\n\n)(\s+)?/', '/\r\n|\r|\n/'),
            array('</p><p>', '<br/>'), $text) . '</p>';
}

2voto

Chris Points 19350

Vous avez besoin du modificateur multiligne pour faire correspondre plusieurs lignes :

preg_replace("/PATTERN/m", "REPLACE", $text);

De plus, dans votre exemple, vous semblez remplacer plus de 2 lignes nouvelles par exactement 2, ce qui n'est pas ce que votre question indique.

2voto

Shaunak Shukla Points 688

J'ai essayé tout ce qui précède, mais cela n'a pas fonctionné pour moi. J'ai alors créé un long chemin pour résoudre ce problème...

Avant :

echo nl2br($text);

Après :

$tempData = nl2br($text);
$tempData = explode("<br />",$tempData);

foreach ($tempData as $val) {
   if(trim($val) != '')
   {
      echo $val."<br />";
   }
}

Et cela a fonctionné pour moi J'ai écrit ici parce que, si quelqu'un est venu ici pour trouver une réponse comme moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X