web-dev-qa-db-fra.com

Remplacer plusieurs lignes, tabulation, espace

Je souhaite remplacer plusieurs caractères Newline par un seul caractère Newline, plusieurs espaces par un seul espace.
J'ai essayé preg_replace("/\n\n+/", "\n", $text); et j'ai échoué!

Je fais aussi ce travail sur le $ text pour le formatage.

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

$ text est un gros texte pris par l'utilisateur pour BLOG, et pour un meilleur formatage, j'utilise Wordwrap.

25
Sourav

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 que\n à la fin de la chaîne. Beaucoup enverront également un\r.

Essayer:

Edit: J'ai simplifié celui-ci:

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

Edit: Et pour résoudre le problème de certains envois\r uniquement:

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

Update 1: Basé sur 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);
48
Francois Deschenes

Voici la réponse, si je comprends bien la question:

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

Modifier

Voici la fonction que j'utilise pour convertir de nouvelles lignes en éléments de saut de ligne et de paragraphe HTML:

/**
 *
 * @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>';
}
8
Sonny

Le modificateur multiligne doit correspondre à plusieurs lignes:

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

Dans votre exemple, vous semblez également remplacer 2 nouvelles lignes par exactement 2, ce qui n’est pas ce que votre question indique.

2
Chris Eberle

J'ai essayé tout ce qui précède, mais cela n'a pas fonctionné pour moi. Ensuite, j'ai 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 venait ici pour trouver une réponse comme moi.

1
Shaunak Shukla

Si vous voulez simplement remplacer plusieurs onglets par un seul, utilisez le code suivant.

preg_replace("/\s{2,}/", "\t", $string);
1
Heman G

Je suggérerais quelque chose comme ça:

preg_replace("/(\R){2,}/", "$1", $str);

Cela s’occupera de tous les caractères de nouvelle ligne Unicode.

1
anubhava

j'ai traité la fonction strip_tags en php, j'ai eu quelques problèmes comme: après un saut de ligne, une nouvelle ligne apparaît avec quelques espaces, puis un nouveau saut de ligne apparaît continuellement, etc.

c'est ma solution pour traiter avec strip_tags

remplace plusieurs espaces en un, plusieurs sauts de ligne en un seul saut de ligne

espérons que cette aide

 function cleanHtml($html)
 {
        // clean code into script tags
        $html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

        // clean code into style tags
        $html = preg_replace('/<\s*style.+?<\s*\/\s*style.*?>/si', '', $html );

        // strip html
        $string = trim(strip_tags($html));

        // replace multiple spaces on each line (keep linebreaks) with single space 
        $string = preg_replace("/[[:blank:]]+/", " ", $string); // (*)

        // replace multiple spaces of all positions (deal with linebreaks) with single linebreak
        $string = preg_replace('/\s{2,}/', "\n", $string); // (**)
        return $string;
 }

les mots clés sont (*) et (**)

0
Hai Nguyen

Remplacez la tête et la fin de la chaîne ou du document!

preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);
0
user3129040

Essaye ça:

preg_replace("/[\r\n]*/", "\r\n", $text); 
0
The Mask