我自己有这么一个字符串
citation
2d6h8y4m
d - days
min - min
h - h
y - years
m - months
s - seconds
我想将今天的日期添加为已保存的时间,即
2 days , 6 hours, 8 years and 4 months
我知道如何以一种简单的方式完成它 - 所有文本的循环和序列号读取,但我的猜测是它可以更简单地完成 - 一个正则表达式。对不起,如果有人给了我这样的功能或者某种程度上我的线索(例如,给出一个角色的模式)就够了,我可以叙述
@INFO
不明白仍然不想做今天的日期添加例如2天,4个月等。
即今天是2014-11-22 5:43:45 加入I 2天后6小时8年零4个月 2022-04-24 11:43:45 p.m。
答案 0 :(得分:0)
单独int
个值& char/word
preg_match_all()
。创建包含字符全部含义的array()
(即h =小时)。然后只是foreach()
。例如:
$avr = array('d'=>'days', 'min'=>'min','h'=>'hours', 'y'=>'years', 'm'=>'months', 's'=>'seconds');
$str = '2d6h8y4m';
preg_match_all('/\d+/', $str, $int);
preg_match_all('/[a-z]+/', $str, $word);
$len = count($int[0]) - 1;
$result = '';
foreach($int[0] as $k=>$v){
if($len == $k){
$result .= ' and ' . $v . ' ' . $avr[$word[0][$k]];
}else{
$suf = ($k == 0) ? '' : ', ';
$result .= $suf . $v . ' ' . $avr[$word[0][$k]];
}
}
echo $result;
<强>输出:强>
2 days, 6 hours, 8 years and 4 months
答案 1 :(得分:0)
你正在寻找的正则表达式是
(\d+)d(\d+)h(\d+)y(\d+)m
\d
匹配任何数字。从中您可以提取括号之间匹配的内容。这是完整的代码:
preg_match("(\d+)d(\d+)h(\d+)y(\d+)m", "2d6h8y4m", $matches);
现在$matches
将是一个数组,其中包含括号之间匹配的内容。 $matches[0]
将是第一个括号(当天),$matches[1]
将是第一个括号(小时)等。
答案 2 :(得分:0)
你为什么要重新发明轮子?
为什么不在[{3}}中存储时间间隔,例如:P8Y5M2DT6H
?
$date = new DateTime();
$interval = new DateInterval('P8Y5M2DT6H');
$date->add($interval);