Получение процента от обновления вывода командной строки - Regex и PHP - PullRequest
2 голосов
/ 14 декабря 2011

Я немного озадачен регулярным выражением, и я пытаюсь получить процентный прогресс в строке программы командной строки на PHP. Сочетание проблем.

Я запускаю скрипт из командной строки, используя exec

exec('python scriptos.py', $returnData, $returnCode);

Тогда я думаю циклически перебирать returnData (который меняется в прямом эфире) - так что я не уверен, как я могу разобрать ответ? Я собирался пропустить через $ returnData - чтобы найти это ...

[download]   1.0% of 218.08M at  431.42k/s ETA 08:32

Тогда я действительно изо всех сил пытаюсь выработать регулярное выражение, чтобы получить этот процент. Моя теория состояла в том, чтобы искать число и конечный процент.

Итак, двусторонний вопрос

  1. Как я могу получить доступ к этому в PHP во время работы процесса?
  2. Как получить данные через регулярное выражение preg_match?

Любая помощь будет наиболее полезной!

Ответы [ 4 ]

3 голосов
/ 14 декабря 2011

для извлечения прогресса из строки вывода используйте this regex:

(\d+(\.\d+)?(?=%))

и для чтения вывода используйте popen():

$handle = popen("yourCommand", "r");
while (!feof($handle)) {
    $data = fgets($handle);
    $matches = array();
    preg_match('/(?<percent>\d+(\.\d+)?(?=%))/', $data, $matches);
    echo $matches["percent"];
}
3 голосов
/ 14 декабря 2011

Часто вы можете просто использовать popen, чтобы прочитать непрерывный вывод команды:

$p = popen("sh -c 'while true ; do echo 99% ; sleep 0.5; done'", "r");
while (!feof($p)) {

    $line = fgets($p);
}

Чтобы получить процент, вам понадобится только простое регулярное выражение, например:

preg_match('#([\d.]+)%#', $line, $match);
$percent = $match[1];
0 голосов
/ 14 декабря 2011
$str = "[download]   99.55% adasdasd";
preg_match("/[0-9]{1,2}\.[0-9]{1,2}%/is", $str, $m);
print $m[0];
0 голосов
/ 14 декабря 2011
<?php

preg_match('#([0-9\.]+)%#', '[download]   1.0% of 218.08M at  431.42k/s ETA 08:32', $matches);

echo $matches[0]; # 1.0%

?>

Также проверьте это ...

<?php

$string = '[download] 1.0% of 218.08M at 431.42k/s ETA 08:32';
$data = explode(' ', $string);

list( , $percentage, , $size, , $speed, , $eta) = $data;

echo $percentage, $size, $speed, $eta;

?>
...