删除多个空格

我正在从MySQL数据库中获得$row['message'] ,我需要删除所有像\n \t这样的空格,等等。

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

应格式化为:

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

我试过了:

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

但它不会删除\n\t ,只是单个空格。 谁能告诉我该怎么做?

你需要:

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

您正在使用\s\s+ ,它表示空格(空格,制表符或换行符),后面跟着一个或多个空格。 这意味着用一个空格replace两个或多个空格。

你想要的是用一个空格replace一个或多个空格,所以你可以使用模式\s\s*\s+ (推荐)

 <?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"; ?> 

这输出

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

我不能在这里复制这个问题:

 $x = "this \n \t\t \n works."; var_dump(preg_replace('/\s\s+/', ' ', $x)); // string(11) "this works." 

我不确定这是否只是一个转录错误,但在你的例子中,你正在使用一个单引号的string。 \n\t只被视为新行和标签,如果你有一个双引号的string。 那是:

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

编辑 :正如Codaddict指出的那样, \s\s+不会replace单个制表符。 我仍然不认为使用\s+是一个有效的解决scheme,所以如何改为:

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

\s已经包含标签和新行,所以这上面的正则expression式似乎是足够的。

简化为一个function:

 function removeWhiteSpace($text) { $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text); $text = preg_replace('/([\s])\1+/', ' ', $text); $text = trim($text); return $text; } 

根据丹尼尔·奥尼尔的回答。

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

没有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; 
 preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']); 

这将用一个空格replace所有制表符,所有换行符以及多个空格,制表符和换行符的所有组合。

 <?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); 

这是我会用的:

一个。 确保使用双引号,例如:

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

湾 要删除多余的空格,请使用:

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

它可能不是最快的解决scheme,但我认为这将需要最less的代码,它应该工作。 我从来没有使用过MySQL,所以我可能是错的。

我使用这个代码和模式:

 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; 

你可以在http://writecodeonline.com/php/上testing

所有你需要的是如下运行它:

 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. 

事实上,如果你想要这样的东西:

 preg_replace('/\n+|\t+|\s+/',' ',$string); 

这将用一个选项卡replace多个选项卡

 preg_replace("/\s{2,}/", "\t", $string); 

没有preg_replace,在循环的帮助下。

 <?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) ; ?>