使用一个或多个空格或制表符拆分字符串

163
如何通过一个或多个空格或制表符拆分字符串?
示例:
A      B      C      D

我想把这个变成数组。


零个或多个空格意味着每个元素最多只有一个字符,或者你将拥有无限多个空元素。您确定这是您想要的吗? - bdonlan
是的,那可能应该是“一个或多个空格”。 - Michael Myers
10个回答

379
$parts = preg_split('/\s+/', $str);

12
可以使用以下代码来避免删除可能为空的最后一部分: $parts = preg_split('/\s+/', $str, -1, PREG_SPLIT_NO_EMPTY); - coeing

64

按制表符分隔:

$comp = preg_split("/\t+/", $var);

按空格/制表符/换行符分隔:

$comp = preg_split('/\s+/', $var);

只按空格分隔:

$comp = preg_split('/ +/', $var);


1
除此之外,还有一个需要至少两个空格的 preg_split('/\s{2,}/', $var); - Angry 84
在字符类中写入\t没有任何好处。 - mickmackusa

25

这个有效:

$string = 'A   B C          D';
$arr = preg_split('/\s+/', $string);

在字符类中写入\s没有任何好处。 - mickmackusa
@mickmackusa 你能澄清一下吗?这与文档中的第一个示例非常相似。 - Hashim Aziz
1
@Hash 文档示例中的分割方式是根据空格和逗号进行分割。当你有多个要列出的项目时([\s,]),创建一个"字符类"是合适的。当你只是根据\s(空格)进行分割时,请使用此答案中的当前语法(由Dharman在我评论后编辑)。 - mickmackusa

19

作者要求使用explode函数,你可以像下面这样使用:

$resultArray = explode("\t", $inputString);

注意:必须使用双引号而不是单引号。


12
但他要求“空格或制表符”,而这只对制表符起作用,会导致程序错误。 - Jeff
4
我来这里也是为了寻找爆炸性空间的。我内心深处感到很悲伤。 - Sergio A.
2
我总是很难过地看到显然不正确的答案被投票到了无法被社区删除的地步。 - mickmackusa
1
请更新以包含空格,以便回答问题。 - RLC
这是你连续发表的第二条评论,你在其中抱怨答案错误,却没有解释原因。也许如果你能明确说明为什么你认为它是错的,那么就会有更少的人对其进行负评了。 - Hashim Aziz
显示剩余3条评论

10

我认为您需要使用preg_split函数:

$input = "A  B C   D";
$words = preg_split('/\s+/', $input);
var_dump($words);

4

这篇帖子并不慷慨。2009年对于Stack Overflow的贡献质量来说是一个令人沮丧的时代。 - mickmackusa

3

这个答案不应该被使用。字符类包含:1. 空格 2. 加号符号和3. 字面空格。这个答案存在根本性的理解不足。 - mickmackusa

1
假设 $string = "\tA\t B \tC \t D ";(包含制表符和空格的混合,包括前导制表符和尾随空格)
显然,仅按空格或仅按制表符进行分割是行不通的。请不要使用这些方法
preg_split('~ +~', $string) // one or more literal spaces, allow empty elements
preg_split('~ +~', $string, -1, PREG_SPLIT_NO_EMPTY) // one or more literal spaces, deny empty elements

preg_split('~\t+~', $string) // one or more tabs, allow empty elements
preg_split('~\t+~', $string, -1, PREG_SPLIT_NO_EMPTY) // one or more tabs, deny empty elements

使用这些:
preg_split('~\s+~', $string) // one or more whitespace character, allow empty elements
preg_split('~\s+~', $string, -1, PREG_SPLIT_NO_EMPTY), // one or more whitespace character, deny empty elements

preg_split('~[\t ]+~', $string) // one or more tabs or spaces, allow empty elements
preg_split('~[\t ]+~', $string, -1, PREG_SPLIT_NO_EMPTY)  // one or more tabs or spaces, deny empty elements

preg_split('~\h+~', $string) // one or more horizontal whitespaces, allow empty elements
preg_split('~\h+~', $string, -1, PREG_SPLIT_NO_EMPTY) // one or more horizontal whitespaces, deny empty elements

以下所有技巧的演示可以在这里找到。
参考:水平空白。

1
这是第一个展示水平空格概念的答案。由于问题只涉及制表符和空格,因此这是目前最正确的答案。 - Dharman

-2
对于需要快速从字符串中提取一个单词的人来说:
$name = "John Doe";
preg_split('/\s+/', $name)[0];
// John

请注意[0],它只会获取第一个单词 - 根据您需要的数组元素进行修改。
或者,为了实现相同的功能,可以选择更高效但不够健壮的解决方案:
$name = "John Doe";
strtok($string, " ")[0];
// John

这个答案包含了多余的见解,有拼写错误,并且提供了误导性的信息。strtok()函数不理解正则表达式。https://3v4l.org/g7ehT 看起来你在错误的页面上发布了问题。如何在PHP中获取句子的第一个单词? - mickmackusa
@mickmackusa XY问题可能会导致人们在寻找解决方案时过于具体(explode),即使他们只需要字符串的第一个单词。这就是我为什么会来到这个问题上,毫无疑问还有无数其他人是通过谷歌找到这个问题的,所以我认为最好用一个合适的解决方案来回答这个问题。 - Hashim Aziz
如果你的工作是组织Stack Overflow的内容,你会欢迎那些超出每个页面要求的贡献吗(请记住,有数百万个页面需要管理)?不会。通过设定问题范围较窄,Stack Overflow能更好地收集关于特定主题的独特见解。 - mickmackusa

-2
我会先去掉空格。
$foo = str_replace(' ', '', $line);
$pieces = explode(',', $foo);

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