删除多个空格


208

$row['message']从MySQL数据库获取数据,因此需要删除所有空白\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,而只能删除单个空格。谁能告诉我该怎么做?


1
换行符和制表符都用单引号引起来,因此您想要它们是文字吗?
Mark Lalor 2010年

我通过将\ sec和\ t更改为双引号来修复了sectin代码的引用。
Buttle Butkus

Answers:


394

你需要:

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

您使用的\s\s+是指空格(空格,制表符或换行符)后跟一个或多个空格。这实际上意味着用单个空格替换两个或多个空格。

您想要的是用单个空格替换一个或多个空格,因此您可以使用模式 \s\s*\s+(推荐)


1
他的方法比这更好:为什么要用一个空格替换一个空格?
尼克

16
他还希望将\ n和\ t替换为空格。现在他的模式与这些不匹配,例如$ x =“ does \ nthis \ twork”; OP希望将所有空格替换为单个空格。
codaddict

@codaddict,我们如何保留\ n并从字符串中删除所有其他多个空格和制表符?请帮助我
Mansoorkhan Cherupuzha 2013年

您能否更具体地说明为什么建议使用“ \ s +”?
Isius

6
请注意,在PHP中\s不包括“ vertical tab” chr(11)。要同时包含它,您需要使用space字符类:[[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav

68
<?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

3
你是一个真正的救星。如果窗外那边,我正要跳出来。
bikey77

整洁,仍然有帮助
spekulatius

16
preg_replace('/[\s]+/mu', ' ', $var);

\s 已经包含制表符和换行符,因此上述正则表达式似乎已足够。


2
这里不需要方括号,因为其中只有一件事。将/m不会有效果,因为没有^$锚和/u不会有,除了稍微慢下来和死没有任何影响,如果输入字符串是无效的UTF-8(它不会影响什么\s比赛,但它会影响\pZ)。
thomasrutter

12

简化为一个功能:

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

根据Danuel O'Neal的回答。


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

2
这是最适合我的那个。另外,我将添加修剪以删除字符串开头和结尾的空白
Dziamid 2012年

@Dziamid您可以通过微调做到这一点(的preg_replace(...))
巴拉兹瓦尔加

7

我无法在这里复制问题:

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

我不确定这是否只是一个转录错误,但是在您的示例中,您使用的是单引号字符串。\n并且\t只有在您使用双引号引起来的字符串时,才会被视为换行符和制表符。那是:

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

编辑:正如Codaddict指出的那样,\s\s+不会替换单个制表符。我仍然不认为使用\s+是一种有效的解决方案,但是如何解决呢:

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

2
+1,是。对于具有大量单个空格的字符串(通常是这种情况),用空格替换空格效率不高。
codaddict

1
@coaddict:为检验您的假设,我编写了一个快速脚本来运行每个替换项的1000个并检查每个项的时间。对于字符串“ +1”,为True。对于具有大量单个空格的字符串(通常是这种情况),用空格替换空格效率不高。– codaddict 2月24日\ '10 at 13:32',一千次\ s + preg_replace()调用花费了0.010547876358032秒,一千次(?:\ s \ s + | \ n | \ t) preg_replace()调用花费了0.013049125671387,它慢了将近30%。
约瑟夫·奇克

您可能想在最后一个示例中添加“ \ r”,因为某些计算机确实单独使用了一个“ \ r”(Apple Mac?)
thomasrutter

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

这将用单个空格替换所有选项卡,所有换行符以及多个空格,选项卡和换行符的所有组合。


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

静态函数remove_whitespace是出于什么原因?您定义但不使用它。
卢卡斯·里西斯

这些都有各自的用途,但是这些都无法实现问题,即只用一个替换多个连续的空格。您的“ remove_doublewhitespace”将只替换同一空格字符的多个,因此它将用“”替换“ \ n \ n \ n”,但对“ \ r \ n”
无济于事

4

没有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;

2

我使用以下代码和模式:

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/上对此进行测试


即使在此查询中的mariaDB中,它也可以与我配合工作: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 非常感谢
jalmatari

1

您所需要做的就是如下运行:

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.

1

这就是我要使用的:

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

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

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

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

它可能不是最快的解决方案,但我认为它将需要最少的代码,并且应该可以工作。我从来没有使用过mysql,所以我可能是错的。


1

说实话,如果您想要这样的话:

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

1

这会将多个标签替换为一个标签

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

-2

如果没有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) ; 

 ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.