解析格式化文本并提取两个值

发布于 2024-07-14 09:10:15 字数 392 浏览 10 评论 0原文

如何使用 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() 的东西但不知道如何对数组执行此操作以及如何引用字符串。 正则表达式需要放置在循环内。

How do I get the percentage and filesize from this sort of string using regex in PHP?

The thing is I get this string using the print_r() function like so:

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

The above outputs something like this:

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

I'm sure I need to use something like preg_match() but not sure how to do it for an array plus how do I reference the string. The regex needs to be placed inside the loop.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

离旧人 2024-07-21 09:10:15

尝试这个:

foreach ($progress as $str) {
    if (preg_match_all('/\[download] (\d+\.\d)% of (\d+\.\d+\w)/', $str, $matches)) {
        var_dump($matches);
    }
}

Try this:

foreach ($progress as $str) {
    if (preg_match_all('/\[download] (\d+\.\d)% of (\d+\.\d+\w)/', $str, $matches)) {
        var_dump($matches);
    }
}
素年丶 2024-07-21 09:10:15
$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);
$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);
夜声 2024-07-21 09:10:15

您也可以只使用:

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

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

You can also just use:

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

It's probably faster than a regex, and easier to read.

踏月而来 2024-07-21 09:10:15

因为您的字符串的格式是可预测的,并且重点是提取而不是验证,所以我同意 @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',
)

Because your string is predictably formatted and the focus is to extract instead of validate, I agree with @gitaarik in that explode() can be suitable.

Split the string on spaces and after you have all of the desired elements, add one more element to the explosion limit so that all of the "leftovers" are slopped into the that last element.

Using array destructuring syntax, you can declare only the variables that you intend to use.

The benefits will be code performance, readability, and no regex knowledge is necessary.

Code: (Demo)

$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]);

Output:

array (
  'percent' => '28.8%',
  'size' => '1.51M',
)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文