从字符串中删除多余的空格


132

我从数据库查询中收到一个字符串,然后删除所有HTML标记,回车符和换行符,然后再将其放入CSV文件。唯一的事情是,我找不到删除方法字符串之间多余的空白的方法。

删除内部空白字符的最佳方法是什么?


6
请发布原始字符串和所需字符串的样本。
Zote

您还可以弄清楚最终的输出结果如何吗?您是在将逗号插入CSV数据,从已包含逗号的数据库中获取逗号,将字符串馈入处理CSV插入的函数等吗?
Frank DeRosa

好的,最终输出需要是一个字符串,每个单词都用一个空格分隔,此刻它是多个空格。
joepour

1
@Joe,我不会浪费时间,而是会开始感谢所有以前帮助过您的人!:)
Frankie

Answers:


286

不确定确切要什么,但是有两种情况:

  1. 如果你只是处理过剩whitespace上,你可以使用字符串的开头或结尾trim()ltrim()或者rtrim()将其删除。

  2. 如果你正在处理一个字符串中多余的空格考虑preg_replacewhitespaces " "*用单whitespace " "

例:

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

62
$ foo = preg_replace('/ \ s + /','',$ foo);
Genio

使用$foo = preg_replace( '/\s+/', ' ', $foo );遗嘱杀死nl2br()
Waiyl Karim

1
只需在使用preg_replace之前使用nl2br,您应该会很好。
Lukas Liesis 2014年

错别字/转义符注意-如果代码没有为您删除多余的空格-请确保在“ s”前
加上

这应该是CSS安全的,对吧?像这样,是否可以安全地压缩包含长的多行CSS字符串的变量?
大卫,

50
$str = str_replace(' ','',$str);

或者,用下划线替换,等等等


7
这将删除所有空格。他只想规范化字符串。
斯文德

12
我一直在寻找的(即使不是问题)
Sevenearths 2012年

@Gigala“删除内部空白字符的最佳方法是什么?” 是问题。这个答案完全可以满足。
Cory Dee 2013年

1
@CoryDe​​e是的,对于最后一个句子。但是在引言中,这个问题被表述为“ 多余的空白”,重点是多余的空白。你最终满足OP的实际问题,所以也没有太大问题,但只要我们得到的技术它...
斯宾塞拉斯金

这不工作,如果计数空间偶数,让说:Hi Earth有4 之间会变成:HiEarth。这并不能解决我的问题。
JJ Labajo

26

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

上面的代码行将删除多余的空格以及前导和尾随空格。


25

没有其他示例适合我,因此我使用了以下示例:

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

这会将所有制表符,换行符,双倍空格等替换为简单的1个空格。


谢谢@ wp78de,但是由于任何原因,我的just都有问题\s+。尽管它是在2014年,所以也许它已经改变了,过去三年没有接触过PHP,无法发表评论,但是在解决方案中仍会保留当前答案,并且在某些情况下可能仍然存在。
卢卡斯·里西斯

9

如果只想替换字符串中的多个空格,例如:"this string have lots of space . " 并且希望答案是 "this string have lots of space",则可以使用以下解决方案:

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

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

echo $strng;

5

如果从用户输入[或其他不受信任的来源]获取有效负载,则使用preg_replace()会有安全缺陷。PHP使用eval()执行正则表达式。如果未正确清理传入的字符串,则您的应用程序可能会遭受代码注入

在我自己的应用程序中,我没有烦恼清理输入(并且因为我只处理短字符串),而是做了一个处理器密集型功能,尽管它很安全,因为它没有eval()任何东西,所以它是安全的。

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

仅当您指定'e'修改程序时,它才使用eval执行它:php.net/manual/en/…。它还说:“此功能在PHP 5.5.0中已弃用,而在PHP 7.0.0中已删除。 ” 因此,您无法再评估preg_replace中的内容。
ADJenks


2

您可以使用:

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

将从字符串的两侧删除多余的空格并将字符串中的两个空格转换为一个空格。请注意,这不会将三个或三个以上的空格连续转换为一个!我可以建议的另一种方法是使用爆破和爆炸,这比较安全,但完全不是最佳方法!

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

我的建议是使用本机for循环或使用正则表达式来完成此类工作。


如果空间比两个空间长,则不能正确转换多个空间。
mikeybeck

1

为了扩展Sandip的答案,我在日志中显示了一堆字符串,这些字符串被误编码为bit.ly。他们打算只对URL进行编码,但在空格后放置一个twitter句柄和其他一些东西。看起来像这样

? productID =26%20via%20@LFS

通常,这不会有问题,但是我尝试了很多SQL注入,因此我将所有无效ID重定向到404。我使用preg_replace方法将无效的productID字符串转换为有效的productID。

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

我在URL中寻找空格,然后删除所有空格。


0

我最近写了一个简单的函数,该函数无需使用正则表达式即可从字符串中删除多余的空格implode(' ', array_filter(explode(' ', $str)))


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