249 votes

Supprimer les espaces multiples

Je reçois $row['message'] à partir d'une base de données MySQL et j'ai besoin de 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é en :

$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 \n o \t seulement des espaces simples. Quelqu'un peut-il me dire comment faire ?

2 votes

Les caractères de nouvelle ligne et de tabulation sont entre guillemets simples, donc vous les voulez littéraux ?

0 votes

J'ai corrigé la citation de la section du code avec le \n y \t en le transformant en guillemets.

459voto

codaddict Points 154968

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 par un seul espace.

Ce que vous voulez, c'est remplacer un ou plusieurs espaces par un seul espace, vous pouvez donc utiliser le modèle \s\s* o \s+ (recommandé)

2 votes

Sa méthode est meilleure que cela : pourquoi remplacer un espace par un espace ?

19 votes

Il veut aussi \n y \t à remplacer par de l'espace. Maintenant son motif ne correspond pas à ceux-ci, disons pour $x = "does \nthis\twork " ; Le PO veut que tous les espaces blancs soient remplacés par un espace unique.

1 votes

@codaddict, comment on peut garder \n et supprimer tous les autres espaces et tabulations multiples de la chaîne de caractères ? aidez-moi s'il vous plaît

77voto

Cez Points 2666
<?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";
?>

Ces sorties

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present

7 votes

Vous êtes un vrai sauveur de vies. J'étais sur le point de sauter par la fenêtre à cause de ça.

0 votes

Neat, toujours utile

2 votes

Je n'y aurais jamais pensé, mais 12 ans plus tard, ça marche toujours aussi bien !

10voto

nickf Points 185423

Je n'arrive 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'agit d'une erreur de transcription ou non, mais dans votre exemple, vous utilisez une chaîne de caractères entre guillemets. \n y \t ne sont traités comme des nouvelles lignes et des tabulations que si vous avez une chaîne entre guillemets. C'est-à-dire :

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

Editar : comme l'a souligné Codaddict, \s\s+ ne remplacera pas un simple caractère de tabulation. Je ne pense toujours pas qu'utiliser \s+ est une solution efficace, alors pourquoi ne pas faire ceci à la place ?

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

3 votes

+1, Vrai. Pour une chaîne de caractères comportant de nombreux espaces simples (ce qui est généralement le cas), il est inefficace de remplacer un espace par un espace.

2 votes

@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, Vrai. Pour une chaîne comportant de nombreux espaces simples (ce qui est généralement le cas), il est inefficace de remplacer un espace par un espace. - codaddict Feb 24 \'10 at 13:32' , mille \s + preg_replace() ont pris 0,010547876358032 secondes, et mille (? : \s\s +| \n | \t ) Les appels à preg_replace() ont pris 0,013049125671387, ce qui le rend presque 30% plus lent.

0 votes

Vous pouvez ajouter " \r "à ce dernier exemple, car certains ordinateurs utilisent un seul " \r " sur son propre compte (Apple Mac ?)

10voto

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

3 votes

C'est celui qui a le mieux fonctionné pour moi. De plus, j'ajouterais trim pour effacer les espaces au début et à la fin de la chaîne.

1 votes

@Dziamid Vous pouvez le faire avec trim(preg_replace(...))

6voto

middus Points 7613
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Cette option remplace toutes les tabulations, tous les retours à la ligne et toutes les combinaisons de plusieurs espaces, tabulations et retours à la ligne par un seul espace.

0 votes

\t & \n sont déjà inclus dans \s donc votre regex est exactement la même chose que \s\s+ qui est mieux écrit \s{2,} tout comme @Alex Polo respuesta

0 votes

J'avais besoin de la même fonctionnalité que dans la question originale, mais sans remplacer l'espace simple par un caractère d'espacement simple. Voici la solution

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