preg_match用于查找以某个字符结尾的单词

时间:2013-08-08 16:17:14

标签: php regex preg-match preg-match-all

我正在尝试创建一个在计时器内搜索的小程序(格式为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。

3 个答案:

答案 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));