PHP替换多个空格为单个空格

229

我想把多个空格替换成一个空格。当我使用ereg_replace时,出现了已过时的错误。

ereg_replace("[ \t\n\r]+", " ", $string);

有没有相同的替代方案。我需要用单个空格替换多个" "空格和多个nbsp空格。

3个回答

477

使用preg_replace(),而不是[ \t\n\r],使用\s

$output = preg_replace('!\s+!', ' ', $input);

正则表达式基本语法参考

\d,\w和\s

简写字符类匹配数字、单词字符(字母、数字和下划线)和空白符(空格、制表符和换行符)。可以在字符类内外使用。


30
偶然间,我刚在真实数据上测试了这些正则表达式,在大约8300篇不同的文本文章上的结果是:/(?:\s\s+|\n|\t)/ => 1410(最慢),/\s+/ => 611(还行),/\s\s+/ => 496(最快)。最后一个不会替换单个的\n\t,但对于我的情况来说这没问题。 - Frunsi
18
如果您遇到UTF-8问题,请添加/u开关。 - user956584
1
对于 Unicode,可以使用 mb_ereg_replace doc - gondo
1
@cletus,干得好!保持这个正则表达式模式的情况下,有没有办法去掉字符串左右两边所有的空格呢?例如,“ a b c ”,应该变成“a b c”。我知道我们可以使用trim($output),但如果能用正则表达式就更好了。 - eawedat
1
这个不起作用;近400人中是否有人测试过包含三个或更多连续空格的输入字符串的代码? - John
显示剩余3条评论

81
$output = preg_replace('/\s+/', ' ',$input);

\s[ \t\n\r]的简写。多个空格将被替换为单个空格。


52
preg_replace("/[[:blank:]]+/"," ",$input)

6
不要替换“\n”(PHP 5.3),使用“/\s+/”就可以完成任务。 ;) - Marek
1
实际上这很有帮助,但它却把我的多字节单词搞乱了,将 Š 替换为某种方块。 - Mārtiņš Briedis
@MārtiņšBriedis 有单独的多字节函数:http://php.net/manual/zh/function.mb-ereg-replace.php - Juha Palomäki
1
与其他答案不同,此命令仅替换空格(而非换行符等),这正是所需之物!非常感谢! - itoctopus

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