如何隔离可能包含 space 的 space 分隔值?

How to isolate space delimited values that may contain a space?

我有一个输入,用户将按以下格式输入 class 时间表

[time] [days] [room]

例如:

7-8 am MWF ROOM1 | 7:30-9:30 am TTH Room2 | 11:30 am-12:30 pm MWF Room3)

所以我尝试使用 space 分解输入,然后获取返回数组的最后两个值并将其设为 $room$days,然后我在原来 $schedule 得到剩余的并使它成为我的 $time.

$sched = explode(" ", $schedule);
if(count($sched) <= 3){
    echo 'please check schedule format!';
}else{
   $room  = array_values(array_slice($sched, -1))[0];
   $days  = array_values(array_slice($sched, -2))[0];
   $times = str_replace($days." ".$room, "" ,$schedule);
}

使用上面的代码我得到了我想要的结果,但问题是当用户没有输入 DAYS 或 ROOM 时文本会调整,所以我没有得到正确的值。

例如这个输入值

11:30 am-12:30 pm mwf (no room)

我得到这个结果:(room:mwf) (days:pm) (times:11:30 am-12:30 )

有更好的方法吗?

此模式将处理完整的字符串并吐出一个多维数组。您希望如何处理结果?

测试代码:(Demo)

//$sched='7-8 am MWF ROOM1 | 7:30-9:30 am TTH Room2 | 11:30 am-12:30 pm MWF Room3';
$sched='MWF ROOM1 | 7:30-9:30 am Room2 | 11:30 am-12:30 pm MWF';
//$sched='ROOM1 | 7:30-9:30 am | MWF | MTWTHFS';

if(preg_match_all('/(?:^|\| )([^|]*?m)? ?([MTWHFS]*) ?([Rr][Oo]{2}[Mm]\d+)?(?: |$)/',$sched,$out,PREG_SET_ORDER)){
    foreach($out as $a){
        if(empty($a[1])){
            echo "Missing/Invalid Time\n";
        }
        if(empty($a[2])){
            echo "Missing/Invalid Days\n";
        }
        if(empty($a[3])){
            echo "Missing/Invalid Room\n";
        }
        var_export(array_slice($a,1));
        echo"\n\n";
    }
}

输出:

Missing/Invalid Time
array (
  0 => '',
  1 => 'MWF',
  2 => 'ROOM1',
)

Missing/Invalid Days
array (
  0 => '7:30-9:30 am',
  1 => '',
  2 => 'Room2',
)

Missing/Invalid Room
array (
  0 => '11:30 am-12:30 pm',
  1 => 'MWF',
)