删除字符串中多余的空格

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

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

298578 次浏览
$str = str_replace(' ','',$str);

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

不确定你到底想要什么,但有两种情况:

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

  2. 如果您正在处理字符串中的额外空格,请考虑多个 whitespaces" "*preg_replace和单个 whitespace" "

例如:

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

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

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

为了进一步阐述 Sandip 的答案,我在日志中发现了一些字符串,这些字符串在 bit.ly 中被错误编码了。他们只是想编写一个 URL,但是在空格后面加了一个 twitter 句柄和其他一些东西。看起来是这样的

? productID =26%20via%20@LFS

通常,这不会是一个问题,但我得到了大量的 SQL 注入尝试,所以我重定向任何不是一个有效的 ID 到404。我使用 preg _ place 方法将无效的 productID 字符串转换为有效的 productID。

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

我在 URL 中查找一个空格,然后删除它之后的所有内容。

其他的例子对我都不管用,所以我用了这个:

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

将所有制表符、新行、双空格等替换为简单的1空格。

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

如果您从用户输入[或其他不受信任的源]获得有效负载,那么使用 preg _ place ()存在安全性缺陷。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;
}

你可使用:

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

字符串的 从两边移除额外的空格和字符串内的 将两个空格转换为一个空格。注意,这不会将一行中的三个或多个空格转换为一个! 另一种方式,我可以建议是使用内爆和爆炸,这是更安全,但完全不是最佳的!

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

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

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

我最近编写了一个简单的函数,它删除了字符串中没有正则表达式 implode(' ', array_filter(explode(' ', $str)))的多余空白。

Laravel 9.7引入了新的 Str::squish()方法来删除多余的空白,包括单词之间多余的空白: https://laravel.com/docs/9.x/helpers#method-str-squish