我正在尝试创建一个在计时器内搜索的小程序(格式为00d 00h 00m 00s)并将日期返回到一个变量,将小时数返回到另一个变量等等。
这是我的一些代码:
$time1 = "Left: 11d 21h 50m 06s <\/div>"
preg_match_all("/ .*d/i", $time1, $timematch); // Day
$time1day = $timematch[1]; // Saves to variable
preg_match_all("/ .*h/i", $time1, $timematch); // Hour
$time1hour = $timematch[1]; // Saves to variable
preg_match_all("/ .*m/i", $time1, $timematch); // Minute
$time1minute = $timematch[1]; // Saves to variable
preg_match_all("/ .*s/i", $time1, $timematch); // Second
$time1second = $timematch[1]; // Saves to variable
我的正则表达式不正确,但我不确定它应该是什么。有什么想法吗?
顺便说一句,我使用的是PHP4。
答案 0 :(得分:1)
这个正则表达式可以解决这个问题:
(\d+)d (\d+)h (\d+)m (\d+)s
每个值(日,小时,分钟,秒)将在一个组中捕获。
关于你的正则表达式:我不知道你的意思是“不正确”,但我想这可能是失败的,因为你的正则表达式是贪婪而不是懒惰({{3} })。尝试使用延迟运算符,或使用更具体的匹配(例如\d
而不是.
)。
修改强>
我需要它们作为单独的变量
匹配后,它们将被放置在结果数组中的不同位置。只需将它们分配给变量。查看示例more info。
如果您无法理解生成的数组结构,则在调用PREG_SET_ORDER
时可能需要使用preg_match_all
标记(更多信息here)。
答案 1 :(得分:1)
如果格式总是按照您显示的顺序排列,我就不会正则表示。以下应该完成你的工作:
$time1= "Left: 11d 21h 50m 06s <\/div>";
$timeStringArray = explode(" ",$timeString);
$time1day = str_replace("d","",$timeStringArray[1]);
$time1hour = str_replace("h","",$timeStringArray[2]);
$time1minute = str_replace("m","",$timeStringArray[3]);
$time1second = str_replace("s","",$timeStringArray[4]);
答案 2 :(得分:0)
如果模式总是这个,两位数加上时间字母,你可以这样做:
$time1 = "Left: 11d 21h 50m 06s <\/div>";
preg_match_all("/(\d{2})[dhms]/", $time1, $match);
print_r($match);
更新:此功能可以使用1或2位数字,并匹配所有参数。
$time1 = "Left: 11d 21h 50m 06s <\/div>";
$time2 = "Left: 21h 50m 5s";
$time3 = "Left: 9m 15s";
function parseTime($str) {
$default = array('seconds', 'minutes', 'hours', 'days');
preg_match_all("/(\d{1,2})[dhms]/", $str, $time);
if (!isset($time[1]) || !is_array($time[1])) {
return null;
}
$default = array_slice($default, 0, count($time[1]));
return array_combine($default, array_reverse($time[1]));
}
print_r(parseTime($time1));
print_r(parseTime($time2));
print_r(parseTime($time3));