我从数据库查询中接收到一个字符串,然后在将其放入 CSV 文件之前删除所有 HTML 标记、回车符和换行符。唯一的问题是,我找不到一种方法来删除字符串从 中间的 过度空白。
删除内部空白字符的最佳方法是什么?
$str = str_replace(' ','',$str);
或者,用下划线替换,等等。
不确定你到底想要什么,但有两种情况:
如果你只是处理字符串开头或结尾的多余的 whitespace,你可以使用 trim(),ltrim()或 rtrim()来删除它。
trim()
ltrim()
rtrim()
如果您正在处理字符串中的额外空格,请考虑多个 whitespaces" "*的 preg_replace和单个 whitespace" "。
" "*
preg_replace
" "
例如:
$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",您可以使用以下解决方案:
"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)))的多余空白。
implode(' ', array_filter(explode(' ', $str)))
Laravel 9.7引入了新的 Str::squish()方法来删除多余的空白,包括单词之间多余的空白: https://laravel.com/docs/9.x/helpers#method-str-squish
Str::squish()