2

如何在 PHP 中使用正则表达式从这种字符串中获取百分比和文件大小?

问题是我使用这样的函数得到这个字符串print_r()

while(!feof($handle))
{
    $progress = fread($handle, 8192);
    print_r($progress); 
} 

上面的输出是这样的:

[download] 28.8% of 1.51M at 171.30k/s ETA 00:06

我确定我需要使用类似preg_match()但不确定如何对数组执行此操作以及如何引用字符串。正则表达式需要放在循环内。

4

4 回答 4

3

试试这个:

foreach ($progress as $str) {
    if (preg_match_all('/\[download] (\d+\.\d)% of (\d+\.\d+\w)/', $str, $matches)) {
        var_dump($matches);
    }
}
于 2009-02-26T10:40:24.477 回答
1
$string = '[download] 28.8% of 1.51M at 171.30k/s ETA 00:06
           [download] 41.8% of 1.51M at 178.19k/s ETA 00:05';

// $string = file_get_contents($file_path);

$pattern = '/(?<percent>[0-9]{1,2}\.[0-9]{1,2})% of (?<filesize>.+) at/';
preg_match_all($pattern, $string, $matches);

print_r($matches);
于 2009-02-26T10:40:06.707 回答
0

您也可以只使用:

$parts = explode(' ', trim($progress));
$progressPercentage = floatval($parts[1]);

它可能比正则表达式更快,并且更易于阅读。

于 2012-10-16T15:42:20.370 回答
0

因为您的字符串是可预测的格式,并且重点是提取而不是验证,所以我同意@gitaarik 的观点,因为这explode()可能是合适的。

在空格上拆分字符串,在获得所有所需元素后,再向爆炸限制添加一个元素,以便将所有“剩菜”放入最后一个元素中。

使用数组解构语法,您可以只声明您打算使用的变量。

好处将是代码性能、可读性,并且不需要正则表达式知识。

代码:(演示

$string = '[download] 28.8% of 1.51M at 171.30k/s ETA 00:06';
// splits: 0--------| 1---| 2| 3---| 4--------------------| 
[, $percent, , $size, ] = explode(' ', $string, 5);
var_export(['percent' => $percent, 'size' => $size]);

输出:

array (
  'percent' => '28.8%',
  'size' => '1.51M',
)
于 2021-03-10T12:53:52.230 回答