0

我正在尝试制作一个在计时器内搜索的小程序(使用这种格式 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。

4

3 回答 3

1

这个正则表达式可以解决问题:

(\d+)d (\d+)h (\d+)m (\d+)s

每个值(天、小时、分钟、秒)将被捕获在一个组中。

关于你的正则表达式:我不知道你所说的“不正确”是什么意思,但我想它可能失败了,因为你的正则表达式是贪婪的而不是懒惰的(更多信息)。尝试使用惰性运算符,或者使用更具体的匹配(例如,\d而不是)。.

编辑:

我需要它们是单独的变量

匹配后,它们将被放置在结果数组中的不同位置。只需将它们分配给变量。在这里查看一个示例。

如果您无法理解生成的数组结构,您可能希望PREG_SET_ORDER在调用时使用该标志preg_match_all(更多信息here)。

于 2013-08-08T16:36:03.383 回答
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]);
于 2013-08-08T16:42:59.283 回答
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));
于 2013-08-08T16:37:45.363 回答