web-dev-qa-db-fra.com

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

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

Quel serait le meilleur moyen de supprimer les caractères d'espacement blancs intérieurs?

124
joepour

Vous ne savez pas exactement ce que vous voulez, mais voici deux situations:

  1. Si vous avez juste affaire à des excès whitespace au début ou à la fin de la chaîne, vous pouvez utiliser trim(), ltrim() ou rtrim() pour la supprimer.

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

Exemple:

$foo = preg_replace('/\s+/', ' ', $foo);
273
jW.
$str = str_replace(' ','',$str);

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

49
Cory Dee

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

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

23
d-_-b

aucun autre exemple n'a fonctionné pour moi, alors j'ai 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 simple 1 espace.

21
Lukas

Si vous souhaitez remplacer uniquement plusieurs espaces dans une chaîne, par exemple: "this string have lots of space . " Et si 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;
9
Apsar
$str = preg_replace('/[\s]+/', ' ', $str);
4
Sandip Layek

Il y a des problèmes de sécurité liés à l'utilisation de preg_replace (), si vous obtenez la charge utile 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 filtrée, votre application risque d'être soumise à injection de code.

Dans ma propre application, au lieu de déranger la désinfection de l'entrée (et comme je ne traite que des chaînes courtes), j'ai plutôt créé une fonction légèrement plus intensive en ressources 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;
}
4
Fom

Vous pouvez utiliser:

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

Ceci supprime les espaces blancs supplémentaires des deux côtés de la chaîne et convertit plusieurs espaces en un seul dans la chaîne.

2
Amir Forsati

Pour développer la réponse de Sandip, de nombreuses chaînes figurant dans les journaux ont été mal codées dans bit.ly. Ils voulaient coder uniquement l'URL, mais mettre un pseudo Twitter et quelques autres éléments après un espace. Ça ressemblait à ça

? productID =26%20via%20@LFS

Normalement, cela ne poserait pas de problème, mais je reçois de nombreuses tentatives d’injection SQL. Je redirige donc tout ce qui n’est pas un ID valide sur un 404. J’ai utilisé la méthode preg_replace pour convertir la chaîne productID non valide en un productID valide.

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

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

1
JScarry

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

0
$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);
0
Shahbaz Khan