Supprimer les espaces blancs en excès dans une chaîne

132

Je reçois une chaîne d'une requête de base de données, puis je supprime toutes les balises HTML, retours chariot et retours à la ligne avant de la mettre dans un fichier CSV. La seule chose est que je ne trouve pas de moyen de supprimer l' excès d' espace blanc entre les chaînes.

Quelle serait la meilleure façon de supprimer les caractères d'espacement internes?

Joepour
la source
6
Veuillez publier un échantillon de la chaîne d'origine et de la chaîne souhaitée.
Zote
Pouvez-vous également clarifier comment le résultat final doit être? Insérez-vous les virgules dans les données pour CSV, l'obtenez-vous à partir d'une base de données contenant déjà des virgules, insérez-vous des chaînes dans une fonction qui gère l'insertion CSV, etc.?
Frank DeRosa
ok la sortie finale doit être une chaîne avec chaque mot séparé par un seul espace, pour le moment, il s'agit de plusieurs espaces.
joepour
1
@Joe, je ne perdrais pas de temps et je commencerais à donner du crédit à tous ceux qui t'ont aidé avant! :)
Frankie

Réponses:

286

Je ne sais pas exactement ce que vous voulez mais voici deux situations:

  1. Si vous êtes juste affaire avec excès whitespacesur le début ou la fin de la chaîne que vous pouvez utiliser trim(), ltrim()ou rtrim()pour le retirer.

  2. Si vous avez affaire à des espaces supplémentaires dans une chaîne, considérez un preg_replacemultiple whitespaces " "*de un avec un seul whitespace " ".

Exemple:

$foo = preg_replace('/\s+/', ' ', $foo);
jW.
la source
62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio
en utilisant le $foo = preg_replace( '/\s+/', ' ', $foo );va tuer les effets denl2br()
Waiyl Karim
1
utilisez simplement nl2br avant d'utiliser preg_replace et vous devriez être prêt à partir.
Lukas Liesis
Note Typo / Escaper - si le code ne supprime pas les espaces supplémentaires pour vous - assurez-vous que vous avez "\" avant "s" :) certaines pages de test php en ligne le suppriment :)
jave.web
Cela devrait être sûr CSS, non? Comme dans, cela compresserait en toute sécurité une variable contenant une longue chaîne CSS sur plusieurs lignes?
David
50
$str = str_replace(' ','',$str);

Ou remplacez par un trait de soulignement, & nbsp; etc.

Cory Dee
la source
7
Cela supprime tous les espaces. Il veut juste normaliser la chaîne.
Svend
12
Ce que je cherchais (même si ce n'était pas la question)
Sevenearths
@Gigala "Quelle serait la meilleure façon de supprimer les espaces intérieurs?" était la question. Cette réponse satisfait parfaitement cela.
Cory Dee
1
@CoryDee C'est vrai, pour cette dernière phrase. Mais dans l'introduction, la question est formulée comme « espace blanc excessif », en mettant l'accent sur l'excès. Vous avez fini par satisfaire le problème ACTUEL de l'OP, donc cela n'a pas beaucoup d'importance, mais tant que nous
Spencer Ruskin
Cela ne fonctionne pas si le nombre de places est nombre pair , disons: Hi Earthavec 4 places entre les deux deviendront: HiEarth. Cela ne résout pas mon problème avec la pertinence de la question.
JJ Labajo
26

$str = trim(preg_replace('/\s+/',' ', $str));

La ligne de code ci-dessus supprimera les espaces supplémentaires , ainsi que les espaces de début et de fin.

d -_- b
la source
25

aucun autre exemple n'a fonctionné pour moi, j'ai donc utilisé celui-ci:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

ceci remplace tous les onglets, les nouvelles lignes, les doubles espaces, etc. en un simple espace.

Lukas Liesis
la source
Merci, @ wp78de mais pour une raison quelconque, j'ai eu des problèmes avec juste \s+. Bien que cela remonte à 2014, il a peut-être changé, n'a pas touché PHP au cours des 3 dernières années, ne peut pas commenter mais laissera la réponse actuelle alors que c'était une solution et peut-être encore dans certains cas.
Lukas Liesis
9

Si vous souhaitez remplacer uniquement plusieurs espaces dans une chaîne, par exemple: "this string have lots of space . " Et vous vous attendez à ce que la réponse soit "this string have lots of space", vous pouvez utiliser la solution suivante:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;
Apsar
la source
5

Il y a des failles de sécurité à utiliser preg_replace (), si vous obtenez la charge utile à partir de l'entrée utilisateur [ou d'autres sources non fiables]. PHP exécute l'expression régulière avec eval (). Si la chaîne entrante n'est pas correctement nettoyée, votre application risque d'être soumise à une injection de code .

Dans ma propre application, au lieu de me soucier de nettoyer l'entrée (et comme je ne traite que des chaînes courtes), j'ai plutôt créé une fonction un peu plus intensive en processeur, bien que sécurisée, car elle n'évalue rien ().

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}
Fom
la source
Il ne l'exécute en utilisant eval que si vous spécifiez le modificateur 'e': php.net/manual/en/ ... il a également dit que "Cette fonctionnalité a été DÉPRÉCIÉE en PHP 5.5.0, et SUPPRIMÉE à partir de PHP 7.0.0. " Vous ne pouvez donc plus évaluer les éléments de preg_replace.
ADJenks
4
$str = preg_replace('/[\s]+/', ' ', $str);
Sandip Layek
la source
2

Vous pouvez utiliser:

$str = trim(str_replace("  ", " ", $str));

Cela supprime les espaces supplémentaires des deux côtés de la chaîne et convertit deux espaces en un dans la chaîne. Notez que cela ne convertira pas trois espaces ou plus d'affilée en un seul! Une autre façon que je peux suggérer est d'utiliser imploser et exploser qui est plus sûr mais totalement pas optimal!

$str = implode(" ", array_filter(explode(" ", $str)));

Ma suggestion est d'utiliser une boucle for native ou d'utiliser regex pour faire ce genre de travail.

Amir Fo
la source
Cela ne convertit pas correctement plusieurs espaces lorsque l'espace est plus long que deux espaces.
mikeybeck
1

Pour développer la réponse de Sandip, j'avais un tas de chaînes apparaissant dans les journaux qui étaient mal codées dans bit.ly. Ils voulaient coder juste l'URL mais mettre un identifiant Twitter et d'autres éléments après un espace. Ça ressemblait à ça

? productID =26%20via%20@LFS

Normalement, ce ne serait pas un problème, mais je reçois beaucoup de tentatives d'injection SQL, donc je redirige tout ce qui n'est pas un ID valide vers un 404. J'ai utilisé la méthode preg_replace pour transformer la chaîne productID invalide en un productID valide.

$productID=preg_replace('/[\s]+.*/','',$productID);

Je cherche un espace dans l'URL, puis je supprime tout ce qui suit.

JScarry
la source
0

J'ai récemment écrit une fonction simple qui supprime l'excès d'espace blanc d'une chaîne sans expression régulière implode(' ', array_filter(explode(' ', $str))).

Zsolt Oroszlány
la source
-1
$str = "I      am a PHP   Developer";
$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