拆分字符串中的第一个空格和最后一个空格,并将输出的大小限制为3

时间:2015-02-13 04:38:21

标签: php regex preg-split

假设我有一个字符串:

ABC DEF SASF  123 (35)

我的预期输出如下:

Array (
     [0] => ABC
     [1] => DEF SASF  123
     [2] => (35)
)

我正在尝试使用$str = preg_split("/(^\S+\s+)|\s+(?=\S+$)/",$str, 3);执行此操作但目前的问题是此RegEx将替换$str[0]中的内容,它就像

Array (
     [0] => 
     [1] => DEF SASF  123
     [2] => (35)
)

如何修改RegEx以输出我的预期结果?

在线示例:https://www.regex101.com/r/rK5lU1/2

2 个答案:

答案 0 :(得分:4)

根据以下正则表达式分割您的输入字符串。

^\S+\K\s+|\s+(?=\S+$)

只需匹配第一个字词,然后在\S+旁边添加\K即可将其弃置。然后匹配以下一个或多个空格。 |或者匹配前一个到最后一个单词的多个空格。 \S+匹配一个或多个非空格字符。

DEMO

$str = "ABC DEF SASF  123 (35)";
$match = preg_split('~^\S+\K\s+|\s+(?=\S+$)~', $str);
print_r($match);

<强>输出:

Array
(
    [0] => ABC
    [1] => DEF SASF  123
    [2] => (35)
)

答案 1 :(得分:2)

^(\S+)\s+|\s+(?=\S+$)

尝试通过此分裂。示例代码。

preg_split('/^(\S+)\s+|\s+(?=\S+$)/', 'ABC DEF SASF  123 (35)', -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)

或者只是匹配并抓住捕获而不是拆分。

^(\S+)\s+(.*?)\s+(\S+)$

See demo

$re = "/^(\\S+)\\s+(.*?)\\s+(\\S+)$/";
$str = "ABC DEF SASF 123 (35)";

preg_match_all($re, $str, $matches);