【问题标题】:How to split abbreviated days of the week?如何拆分一周中的缩写日期?
【发布时间】:2017-06-28 05:42:04
【问题描述】:

我正在尝试拆分字符串MTWTHFS(星期几)并将其存储为数组。

我已经尝试过str_split(),但它也会在星期四拆分TH

if(strpos($days, 'TH') !== false) {
    $withth = str_replace("TH", "" ,$days);
}else{
    $day = str_split($days);
    print_r($day);  
}  

我还尝试在拆分之前先删除字符串中的TH。 当字符串中没有 TH 时,str_split() 很好。

这是我想要的结果:

array([0]=>'M', [1]=>'T', [2]=>'W', [3]=>'TH', [4]=>'F', [5]=>'S')

有没有更好的方法来做到这一点?

【问题讨论】:

  • @mickmackusa 我有一个输入,用户将在其中输入课程表。例如上午 7:30 - 上午 9:00 MTWTH Room1。所以我必须分开MTWTH的日子并单独存储它们。所以我应该想出数组([0]=>'M',[1]=>'T',[2]=>'W',[3]=>'TH')。我认为这是最终结果

标签: php string validation split days


【解决方案1】:

我相信会有几种方法可以做到这一点。这是preg_split()的一种方法

代码:(PHP Demo)

$days = 'MTWTHFS';
$split = preg_split('/.H?\K/', $days, 0, PREG_SPLIT_NO_EMPTY);
var_export($split);

输出:

array (
  0 => 'M',
  1 => 'T',
  2 => 'W',
  3 => 'TH',
  4 => 'F',
  5 => 'S',
)

Pattern Demo


对于任何出于任何原因希望使用非正则表达式方法的人,都可以这样做:

$days = 'MTWTHFS';
for ($i = 0, $k = -1, $len = strlen($days); $i < $len; ++$i) {
    if ($days[$i] == 'H') {
        $split[$k] .= 'H';
    } else {
        $split[++$k] = $days[$i];
    }
}

似乎 PHP 5.5 不喜欢模式中的\K。这将提供所需的结果:

$split = preg_split('/(.H?)/', $days, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

【讨论】:

  • 如果天字符串上有 TH,这个就成功了。如果字符串中没有 TH 怎么办?像 MTFS?或 MWF
  • 我得到一个不正确的输出数组(0 => 'M', 1 => 'TW', 2 => 'TH', 3 => 'FS', )
  • @Raymond 无论H 是否出现,我的任何一种方法都将起作用。随意使用我在回答中提供的 PHP Demo 链接。
  • 我尝试了您提供的演示,它在版本 7 中可以正常工作。但我尝试将它运行到我当前使用的 5.5,结果不一样。我可以试试你提供的另一个。谢谢
  • @Raymond 我为您的版本添加了第三个解决方案。
猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多