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?
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é)
<?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
preg_replace('/[\s]+/mu', ' ', $var);
\s
contient déjà des onglets et de nouvelles lignes, ce regex ci-dessus semble donc suffisant.
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.
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);
$str='This is a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
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.
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;
<?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);
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.
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.
remplace plusieurs onglets par un seul
preg_replace("/\s{2,}/", "\t", $string);
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 /
Sur la vérité, si pense que vous voulez quelque chose comme ceci:
preg_replace('/\n+|\t+|\s+/',' ',$string);
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) ;
?>