拆分字符串中的第一个 space 和最后一个 space 并将输出的大小限制在 3

Split the first space and the last space in a string and limit the size of output in 3

假设我有一个字符串:

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

只需根据以下正则表达式拆分您的输入字符串即可。

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

只匹配第一个单词,然后通过在 \S+ 旁边添加 \K 来丢弃它。然后匹配以下一个或多个space。 | 或者再匹配一个 space 就在最后一个单词之前。 \S+ 匹配一个或多个非 space 字符。

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)
)
^(\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);