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

158

我从数据库查询中获得了一个字符串,然后我在将其放入CSV文件之前删除了所有的HTML标签、回车和换行符。唯一的问题是,我找不到一种方法来删除字符串之间多余空格。

如何最好地删除内部的空格字符?


6
原始字符串示例:我正在学习机器学习,这对我的职业发展非常有帮助。但是,我发现有些概念非常难以理解。期望的字符串示例:我正在学习机器学习,它对我的职业发展非常有帮助。但是,我发现有些概念很难理解。 - Zote
你能否澄清最终输出的需求是什么?你是将逗号插入到CSV数据中,从已经包含逗号的数据库中获取数据,将字符串输入到处理CSV插入的函数中,还是其他方式? - Frank DeRosa
最终输出需要是一个字符串,每个单词之间用一个空格分隔,目前是多个空格。 - joepour
1
@Joe,我不会浪费时间,而是开始给之前帮助过你的人们致谢! :) - Frankie
12个回答

333

不确定您需要什么,但这里有两种情况:

  1. 如果您只是处理字符串开头或结尾的多余空格,可以使用 trim()ltrim()rtrim() 来去除它。

  2. 如果您要处理字符串内部额外的空格,请考虑使用 preg_replace 将多个空格 " "* 替换为单个空格 " "

示例:

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

66
$foo = preg_replace('/\s+/', ' ', $foo); - genio
使用 $foo = preg_replace( '/\s+/', ' ', $foo ); 将会破坏 nl2br() 的效果。 - Waiyl Karim
1
只需在使用 preg_replace 之前使用 nl2br,您就可以顺利进行了。 - Lukas Liesis
笔误/转义符注意事项 - 如果代码没有为您删除额外的空格,请确保在"s"之前有"" :) 一些在线PHP测试页面会将其删除 :) - jave.web
这个应该是CSS安全的,对吧?也就是说,这可以安全地压缩一个包含长的、多行的CSS字符串的变量? - David

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

或者,用下划线、& nbsp;等替换。


13
这会移除所有空格。他只是想让字符串变得规范化。 - Svend
13
我正在寻找的东西(即使这不是问题)。 - Robert Johnstone
“@Gigala问道:“什么是去除内部空格字符的最佳方法?”这个答案完美地满足了这个问题。” - Cory Dee
2
@CoryDee 这是真的,在最后一句话中确实如此。但在引言中,问题被表述为“过多的空格”,强调了过多这个词。你最终解决了 OP 的实际问题,所以并不重要,但只要我们对此技术上进行讨论... - Spencer Ruskin
如果“空格”的数量是偶数,则此方法不起作用,例如:“Hi Earth”中间有4个“空格”,将变成“HiEarth”。这无法解决我在问题中的困境。 - JJ Labajo
$str = str_replace(' ',' ',$str); 可以用来去除多余的空格。 - vishalknishad

34

其他示例都没有对我起作用,所以我使用了这个:

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

这将所有制表符、换行符、双空格等替换为简单的一个空格。


谢谢,@wp78de,但出于某种原因,我使用\s+时遇到了问题。虽然那是在2014年的事情,也许现在已经改变了,我已经三年没有接触PHP了,无法发表评论,但会保留当前答案,因为它曾经是一个解决方案,在某些情况下仍然可能有效。 - Lukas Liesis

28

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

这行代码将会移除 额外的 空格,以及字符串开头和结尾的空格。


13
如果您想仅替换字符串中的多个空格,例如:"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;

绝对正常工作。 - saravana

4
$str = preg_replace('/[\s]+/', ' ', $str);

4

您可以使用:

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

这个功能会从字符串的两侧移除额外的空格,并且在字符串内部将两个空格转换为一个。请注意,这不会将连续三个或更多的空格转换为一个! 另一种我可以建议的方法是使用implode和explode,这是更安全但不太理想的方法!

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

我的建议是使用本地for循环或正则表达式来完成这种任务。


这个程序无法正确地转换多个空格,特别是当空格长度超过两个时。 - mikeybeck

3

使用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;
}

3
只有在指定了“e”修改器时,它才会使用eval来执行它:https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#reference.pcre.pattern.modifiers.eval 它还说:“此功能已于PHP 5.5.0中弃用,并于PHP 7.0.0中删除。”因此,您不能再在preg_replace中使用eval。 - ADJenks

0
为了补充Sandip的回答,我的日志中出现了一堆被错误编码的字符串。他们本意只是对URL进行编码,但在空格后面却加上了Twitter用户名和其他内容。它看起来像这样:
? productID =26%20via%20@LFS

通常情况下这不会成为问题,但我正在经历很多SQL注入尝试,因此我将任何无效的ID重定向到404页面。我使用preg_replace方法使得无效的productID字符串变成有效的productID。
$productID=preg_replace('/[\s]+.*/','',$productID);

我会寻找URL中的空格,并删除其后的所有内容。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接