Преобразование вывода регулярного выражения PHP - PullRequest
3 голосов
/ 28 сентября 2011

Я хочу превратить вывод, например, в 12 ч 34 м 45 с в 12: 34: 45

также возможно, если один из них будет возвращен пустым - он будет игнорироваться. Таким образом, 34m 45s должны быть 00:34:45, и, конечно, однозначные цифры должны быть возможны, например, 1h 4m 1s, и комбинация из одно- и двузначных цифр, например, 12h 4m 12s и т. Д.

Может кто-нибудь помочь, пожалуйста?

Это фактический код

$van = $_POST['gespreksduur_van']; $tot = $_POST['gespreksduur_tot']; $regex = '/(\d\d?h ?)?(\d\d?m ?)?(\d\d?s)?/';

        if(preg_match($regex, $van, $match) AND preg_match($regex, $tot, $matches))
        {
            for ($n = 1; $n <= 3; ++$n) { if (!array_key_exists($n, $match)) $match[$n] = 0; }
            for ($i = 1; $i <= 3; ++$i) { if (!array_key_exists($i, $matches)) $matches[$i] = 0; }

            $van = printf("%02d:%02d:%02d", $matches[1], $matches[2], $matches[3]);
            $tot = printf("%02d:%02d:%02d", $match[1], $match[2], $match[3]);

            print($van);
            print($tot);

            $data['gespreksduurvan'] = htmlspecialchars($van);
            $data['gespreksduurtot'] = htmlspecialchars($tot);

            $smarty->assign('gsv',$data['gespreksduurvan']);
            $smarty->assign('gst',$data['gespreksduurtot']);
        }

Ответы [ 4 ]

0 голосов
/ 28 сентября 2011
$string = "12h 34m 45s";
$string = str_replace(array("h","m","s"), array(":",":",""), str_replace(" ", "", $string));

echo $string;

Как-то так?

0 голосов
/ 28 сентября 2011

Если вы хотите использовать регулярные выражения, вы можете использовать preg_replace_callback

    <?php


function callback($matches)
{   
    var_dump($matches);
    if ($matches[2] == "") $matches[2] = "00";
    if ($matches[4] == "") $matches[4] = "00";
    if ($matches[6] == "") $matches[6] = "00";
    return $matches[2] . ":" . $matches[4] . ":" . $matches[6];
}   

$str = "12h 34m 45s";
$str = preg_replace_callback("`(([0-2]?[0-9])h )?(([0-5]?[0-9])m )?(([0-5]?[0-9])s)?`", "callback", $str, 1); 

echo $str;
0 голосов
/ 28 сентября 2011

вот как вы можете сделать это без регулярных выражений

// function for your purpose
function to_time($str){
    $time_arr = explode(' ', $str);
    $time_h = '00';
    $time_m = '00';
    $time_s = '00';
    foreach($time_arr as $v){
        switch(substr($v, -1)){
            case 'h': $time_h = intval($v); break;
            case 'm': $time_m = intval($v); break;
            case 's': $time_s = intval($v); break;
        }
    }
    return $time_h . ':' . $time_m . ':' . $time_s;
}

//test array
$time[] = '1h 45s';
$time[] = '12h 35m 45s';
$time[] = '1m 45s';

// output
foreach($time as $t)
    var_dump(to_time($t));

Это выводит

string '1:00:45' (length=7)
string '12:35:45' (length=8)
string '00:1:45' (length=7)
0 голосов
/ 28 сентября 2011

Вы можете использовать регулярное выражение для извлечения компонентов, а затем printf() для форматирования компонентов по своему усмотрению:

$time = "1h 45m";
preg_match("/(\d\d?h ?)?(\d\d?m ?)?(\d\d?s)?/", $time, $matches);
for ($i = 1; $i <= 3; ++$i) { if (!array_key_exists($i, $matches)) $matches[$i] = 0; }
printf("%02d:%02d:%02d", $matches[1], $matches[2], $matches[3]);

Регулярное выражение допускает дополнительные компоненты.Цикл for просто заполняет все недостающие ключи значением по умолчанию, равным нулю (чтобы предотвратить неопределенные ошибки клавиш, когда пропущены секунды или обе минуты / секунды).Printf всегда печатает все компоненты с двумя нулями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...