我有一个像下面这样的字符串
$num = "20142311.235504";
我想按照以下格式分割字符串
$date['year'] = 2014;
$date['Month'] = 23;
$date['day'] = 11;
$date['hour'] = 23;
$date['min'] = 55;
$date['sec'] = 04;
或者甚至是像下面这样的日期形式
2014/23/11 23:55:04
我尝试使用
preg_split('/(d{4})/',$num,$matches);
和 str_split
但没有得到所需的输出。
如果字符串是日期,你可以这样做:
$num = "20142311.235504";
// You create a date with your string according to your current format
$date = date_create_from_format("Ydm.His", $num);
// Now you can play with it
$formattedDate = $date->format("Y/d/m H:i:s"); // `string(19) "2014/23/11 23:55:04"`
$dateTest['year'] = $date->format("Y"); // 2014
$dateTest['Month'] = $date->format("m"); // 11
$dateTest['day'] = $date->format("d"); // 23
$dateTest['hour'] = $date->format("H"); // 23
$dateTest['min'] = $date->format("i"); // 55
$dateTest['sec'] = $date->format("s"); // 04
借助正则表达式,您可以做到这一点。在模式中创建服装年、月、日、小时、分钟和秒的捕获组。简单示例:
$str = "20142311.235504";
preg_match('~^(?<year>\d{4})(?<day>\d{2})(?<month>\d{2}).(?<hour>\d{2})(?<minute>\d{2})(?<second>\d{2})$~', $str, $match);
echo '<pre>', print_r($match);
但是我准备让你使用
date_create_from_format()
,它比正则表达式更容易、更快。首先,转换由 -
分隔的已知日期格式,分解该格式以转换数组,最后将数组分配给一组键 [通过 array_combine()]。 示例:
$str = "20142311.235504";
$match = array_combine(['year', 'month', 'day', 'hour', 'minute', 'second'], explode('-', (date_create_from_format("Ydm.His", $str))->format('Y-m-d-H-i-s')));
echo '<pre>', print_r($match);
您的示例中有一个错误,表明月份是
23
。 无论如何,我会回答问题的现状。
$num = "20142311.235504";
sscanf(
$num,
'%04s%02s%02s.%02s%02s%02s',
$result['year'],
$result['month'],
$result['day'],
$result['hour'],
$result['minute'],
$result['second']
);
var_export($result);
或者
[
$result['year'],
$result['month'],
$result['day'],
$result['hour'],
$result['minute'],
$result['second']
] = sscanf(
$num,
'%04s%02s%02s.%02s%02s%02s'
);
var_export($result);
如果您只想重新格式化数组,则可以使用
vprintf()
将解析后的数组数据打印为字符串。 演示
$num = "20142311.235504";
vprintf(
'%s-%s-%s %s:%s:%s',
sscanf($num, '%04s%02s%02s.%02s%02s%02s')
);
// 2014-23-11 23:55:04