Supprimer plusieurs espaces blancs

208

Je viens $row['message']d'une base de données MySQL et j'ai besoin de supprimer tous les espaces comme \n \tet ainsi de suite.

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

doit ê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 il ne supprime pas \nou \t, juste des espaces simples. Quelqu'un peut-il me dire comment faire cela?

creativz
la source
1
Les caractères de nouvelle ligne et de tabulation sont entre guillemets simples, vous voulez donc qu'ils soient littéraux?
Mark Lalor
J'ai corrigé la citation de la sectin de code avec le \ n et \ t en le changeant en guillemets doubles.
Buttle Butkus

Réponses:

394

Vous avez besoin:

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

Vous utilisez \s\s+ce qui signifie un espace (espace, tabulation ou nouvelle ligne) suivi d'un ou 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 par un seul espace, afin que vous puissiez utiliser le motif \s\s*ou \s+(recommandé)

codaddict
la source
1
sa méthode est meilleure que cela: pourquoi voudriez-vous remplacer un espace par un espace?
nickf le
16
Il souhaite également que \ n et \ t soient remplacés par de l'espace. Maintenant, son modèle ne correspond pas à ceux-ci, disons pour $ x = "does \ nthis \ twork"; L'OP souhaite que tous les espaces soient remplacés par un seul espace.
codaddict
@codaddict, comment pouvons-nous conserver \ n et supprimer tous les autres espaces et tabulations multiples de la chaîne? s'il vous plaît aidez-moi
Mansoorkhan Cherupuzha
Pouvez-vous expliquer plus précisément pourquoi "\ s +" est recommandé?
Isius
6
Notez qu'en PHP n'inclut \spas "onglet vertical" chr(11). Pour l'inclure également, vous devez utiliser la spaceclasse de caractères: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav
68
<?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 sorties

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
Cez
la source
3
Vous êtes une vraie bouée de sauvetage. J'étais sur le point de sauter si la fenêtre sur ce point.
bikey77
Propre, toujours utile
spekulatius
16
preg_replace('/[\s]+/mu', ' ', $var);

\s contient déjà des tabulations et de nouvelles lignes, donc cette expression régulière ci-dessus semble être suffisante.

Anonyme
la source
2
Les crochets ne sont pas nécessaires ici, car ils ne contiennent qu'une seule chose. La /mcoutume de avoir un effet , car il n'y a pas ^ou les $ancres et /un'aura aucun effet , sauf pour le ralentir légèrement et mourir si la chaîne d'entrée n'est pas valide UTF-8 (il ne touche pas ce qui \scorrespond, mais il toucherait \pZ).
thomasrutter
12

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.

Lukas Liesis
la source
7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
ghostdog74
la source
2
C'est celui qui a le mieux fonctionné pour moi. De plus, j'ajouterais un trim pour effacer les espaces au début et à la fin de la chaîne
Dziamid
@Dziamid Vous pouvez le faire avec la garniture (preg_replace (...))
Balázs Varga
7

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 si c'était juste une erreur de transcription ou non, mais dans votre exemple, vous utilisez une chaîne entre guillemets simples. \net \tne sont traités comme des sauts de ligne et des tabulations que si vous avez une chaîne entre guillemets doubles. 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 \s+soit une solution efficace, alors pourquoi pas à la place:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
nickf
la source
2
+1, vrai. Pour une chaîne avec beaucoup d'espaces simples (ce qui est généralement le cas), il est inefficace de remplacer un espace par de l'espace.
codaddict
1
@coaddict: pour tester votre hypothèse, j'ai écrit un script rapide pour parcourir 1000 de chaque remplacement et vérifier le timing de chacun. Pour la chaîne '+1, True. Pour une chaîne avec beaucoup d'espaces simples (ce qui est généralement le cas), il est inefficace de remplacer un espace par de l'espace. - codaddict 24 février \ '10 à 13:32 ' , mille \ s + appels preg_replace () ont pris 0,010547876358032 secondes et mille (?: \ S \ s + | \ n | \ t) appels preg_replace () ont pris 0,01304912567671387, ce qui a fait il est presque 30% plus lent.
Joseph Cheek
Vous voudrez peut-être ajouter "\ r" à ce dernier exemple car certains ordinateurs utilisent un seul "\ r" seul (Apple Mac?)
thomasrutter
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Cela remplace tous les tabulations, tous les sauts de ligne et toutes les combinaisons de plusieurs espaces, tabulations et sauts de ligne avec un seul espace.

middus
la source
4
<?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);
Danuel O'Neal
la source
la fonction statique remove_whitespace est pour quelle raison? Vous le définissez mais ne l'utilisez jamais.
Lukas Liesis
Celles-ci ont chacune leur utilité, mais aucune d'elles n'atteindrait ce que la question demande qui est de remplacer plusieurs espaces consécutifs par un seul. Votre "remove_doublewhitespace" remplacerait seulement plusieurs du même caractère d'espaces blancs, donc il remplacerait "\ n \ n \ n" par un '', mais il ne ferait rien pour "\ r \ n"
thomasrutter
4

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;
Hharek
la source
2

J'utilise ce code et ce modèle:

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

Catalin T.
la source
Cela fonctionne avec moi même dans mariaDB dans cette requête: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 Merci beaucoup
jalmatari
1

Il vous suffit 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.
Alex Polo
la source
1

Voici 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 des 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'elle nécessitera le moins de code, et cela devrait fonctionner. Je n'ai jamais utilisé mysql, donc je peux me tromper.

matsolof
la source
1

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

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

cela remplacera plusieurs onglets par un seul onglet

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

Sans preg_replace, à 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) ; 

 ?>
Shahbaz Khan
la source