Supprimer plusieurs espaces

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

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

doit être formaté comme suit:

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

j'ai essayé:

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

mais il ne supprime pas n ou t , juste des espaces simples. Quelqu'un peut me dire comment faire cela?

166
demandé sur Amal Murali 2010-02-24 16:02:06

15 réponses

Vous avez besoin de:

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

vous utilisez \s\s+ qui signifie Espace(Espace, tab ou newline) suivi d'un ou plusieurs espaces. Ce qui signifie effectivement remplacer deux espaces ou plus par un espace unique.

ce que vous voulez est de remplacer un ou plusieurs espaces blancs avec un seul espace blanc, de sorte que vous pouvez utiliser le modèle \s\s* ou \s+ (recommandé)

322
répondu codaddict 2013-01-15 03:45:44
<?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";
?>

Ce sorties

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
60
répondu Cez 2012-09-24 03:05:42
preg_replace('/[\s]+/mu', ' ', $var);

\s contient déjà des onglets et de nouvelles lignes, ce regex ci-dessus semble donc suffisant.

9
répondu Anonymous 2014-05-27 16:17:48

simplifié pour une fonction:

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

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

9
répondu Lukas 2015-05-29 12:45:24

Je ne peux pas répliquer le problème ici:

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

Je ne suis pas sûr que ce soit juste une erreur de transcription ou pas, mais dans votre exemple, vous utilisez une chaîne de caractères avec une seule citation. \n et \t ne sont traités comme nouvelle ligne et onglet que si vous avez une chaîne double citation. C'est-à-dire:

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

Edit : comme Codaddict l'a souligné, \s\s+ ne remplacera pas un seul caractère d'onglet. Je ne pense toujours pas que utiliser \s+ est cependant une solution efficace, alors pourquoi pas ceci à la place:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
7
répondu nickf 2010-02-24 13:26:21
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
5
répondu ghostdog74 2010-02-24 13:14:51
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

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

4
répondu middus 2010-06-27 11:36:35

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
répondu hharek 2015-05-12 18:55:17
<?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
#    // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])+/', ' ', $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"151900920"\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
répondu Danuel O'Neal 2012-06-05 03:23:13

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
répondu Alex Polo 2010-06-27 11:31:25

C'est ce que j'utiliserais:

A. 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 qu'il faudra le moins de code, et ça devrait marcher. Je n'ai jamais utilisé mysql, donc je me trompe peut-être.

1
répondu matsolof 2010-09-19 19:30:42

remplace plusieurs onglets par un seul

preg_replace("/\s{2,}/", "\t", $string);
1
répondu Heman G 2014-04-02 02:44:32

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 le tester sur http://writecodeonline.com/php /

0
répondu Catalin T. 2012-06-24 15:39:12

Sur la vérité, si pense que vous voulez quelque chose comme ceci:

preg_replace('/\n+|\t+|\s+/',' ',$string);
0
répondu BigBlast 2013-05-09 05:48:08

sans preg_replace, avec l'aide de loop.

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
    if (isset($str_arr[$i + 1])
       && $str_arr[$i] == ' '
       && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
    } 
    else {
      continue;
    }
}

 echo implode("", $str_arr) ; 

 ?>
0
répondu Shahbaz Khan 2016-12-01 03:22:15