web-dev-qa-db-fra.com

Supprimer plusieurs espaces blancs

Je reçois $row['message'] à partir d'une base de données MySQL et je dois supprimer tous les espaces tels que \n\t et ainsi de suite.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

devrait être formaté pour:

$row['message'] = 'This is a Text and so on Text text.';

J'ai essayé:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

mais cela ne supprime pas \n ou \t, seulement des espaces simples. Quelqu'un peut-il me dire comment faire ça?

191
creativz

Vous avez besoin:

$ro = preg_replace('/\s+/', ' ',$row['message']);

Vous utilisez \s\s+ qui signifie un espace (espace, tabulation ou nouvelle ligne) suivi d'un ou de plusieurs espaces. Ce qui signifie effectivement remplacer deux ou plusieurs espaces blancs par un seul espace.

Ce que vous voulez, c'est remplacer un ou plusieurs espaces blancs par des espaces simples, afin que vous puissiez utiliser le modèle \s\s* ou \s+ (recommandé)

366
codaddict
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

Cette sortie

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
64
Cez
preg_replace('/[\s]+/mu', ' ', $var);

\s contient déjà des tabulations et de nouvelles lignes, donc la regex ci-dessus semble suffisante.

12
Anonymous

simplifié à une fonction:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

basé sur la réponse de Danuel O'Neal.

10
Lukas
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
7
ghostdog74

Je ne peux pas reproduire le problème ici:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

Je ne sais pas s'il s'agissait simplement d'une erreur de transcription ou non, mais dans votre exemple, vous utilisez une chaîne entre guillemets. \n et \t ne sont traités comme des nouvelles lignes et des tabulations que si vous avez une chaîne à double guillemet. C'est:

'\n\t' != "\n\t"

Edit: comme Codaddict l'a souligné, \s\s+ ne remplacera pas un seul caractère de tabulation. Je ne pense toujours pas que l’utilisation de \s+ soit une solution efficace, alors pourquoi ne pas utiliser ceci:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
7
nickf

Sans preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;
4
hharek
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Ceci remplace tous les onglets, toutes les nouvelles lignes et toutes les combinaisons d'espaces multiples, d'onglets et de nouvelles lignes avec un seul espace.

4
middus
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);
3
Danuel O'Neal

C'est ce que j'utiliserais:

une. Assurez-vous d'utiliser des guillemets doubles, par exemple:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

b. Pour supprimer les espaces supplémentaires, utilisez:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

Ce n'est peut-être pas la solution la plus rapide, mais je pense que cela nécessitera le moins de code, et cela devrait fonctionner. Je n'ai jamais utilisé mysql, alors je me trompe peut-être.

1
matsolof

Tout ce dont vous avez besoin est de l’exécuter comme suit:

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
1
Alex Polo

Sur la vérité, si pensez que vous voulez quelque chose comme ça:

preg_replace('/\n+|\t+|\s+/',' ',$string);
0
BigBlast

cela remplacera plusieurs onglets par un seul

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

J'utilise ce code et ce motif:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

Vous pouvez tester ceci sur http://writecodeonline.com/php/

0
Catalin T.