从更新命令行输出中获取百分比 - 正则表达式和PHP

时间:2011-12-14 18:30:07

标签: php regex system exec

我对正则表达式感到有些困惑,我正试图从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. 如何通过regex preg_match获取数据?
  3. 任何帮助都会有所帮助!

4 个答案:

答案 0 :(得分:3)

您通常可以使用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];

答案 1 :(得分:3)

从输出行this正则表达式

中提取进度
(\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"];
}

答案 2 :(得分:0)

<?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;

?>

答案 3 :(得分:0)

$str = "[download]   99.55% adasdasd";
preg_match("/[0-9]{1,2}\.[0-9]{1,2}%/is", $str, $m);
print $m[0];