Я пытаюсь сделать небольшую программу, которая ищет в таймере (с этим форматом 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.
Это регулярное выражение будет делать трюк:
(\d+)d (\d+)h (\d+)m (\d+)s
Каждое значение (день, час, минута, секунда) будет зафиксировано в группе.
О вашем регулярном выражении: я не знаю, что вы подразумеваете под «неправильным», но я думаю, что это, вероятно, не работает, потому что ваше регулярное выражение является жадным, а не ленивым ( подробнее ). Попробуйте использовать ленивых операторов или использовать более конкретные совпадения (например, \d
вместо .
).
РЕДАКТИРОВАТЬ:
Мне нужно, чтобы они были отдельными переменными
После согласования они будут помещены в разные местоположения в результирующем массиве. Просто назначьте их переменным. Посмотрите пример здесь .
Если у вас возникли проблемы с пониманием результирующей структуры массива, вы можете использовать флаг PREG_SET_ORDER
при вызове preg_match_all
(дополнительная информация здесь ).
Если формат всегда находится в том порядке, который вы показываете, я бы не стал его регулярным выражением. Следующее должно выполнить вашу работу:
$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]);
Если шаблон всегда это, две цифры плюс буква времени, вы можете сделать это:
$time1 = "Left: 11d 21h 50m 06s <\/div>"; preg_match_all("/(\d{2})[dhms]/", $time1, $match); print_r($match);
UPDATE: эта функция может работать с 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));