在preg_match_all中获取两个模式之间的单词

时间:2015-04-26 15:09:19

标签: php regex preg-match-all

我正在尝试从以下字符串中获取下载的百分比值。

[download] Destination: Kool - Get Noticed - Apurbo-7CggL03TTl4.mp4
[download] 100% of 1.60MiB in 00:21
[download] Destination: Kool - Get Noticed - Apurbo-7CggL03TTl4.m4a
[download] 100% of 164.86KiB in 00:01

对于前。只有值'100' between '[download]' and '% of'。 这是我迄今为止尝试过的代码

$file = file_get_contents("t.txt");
if (preg_match_all("/(?<=\[download\])(.*?)(?=\% of)/s", $file, $result))
for ($i = 1; count($result) > $i; $i++) {
    print_r($result[$i]);
}

但问题是它从第一行获得并输出如

Array ( [0] => Destination: Kool - Get Noticed - Apurbo-7CggL03TTl4.mp4 [download] 100 [1] => Destination: Kool - Get Noticed - Apurbo-7CggL03TTl4.m4a [download] 100 ) 

如果我能在'% of'之前抓住,我认为这是可以的。我是否应该坚持使用此代码来修改或更改整个模式?

1 个答案:

答案 0 :(得分:2)

这应该适合你:

这里我首先将您的文件放入一个file()的数组中,其中每一行都是一个数组元素。在那里,我忽略了新的行字符和空行。

在此之后,我会使用array_map()检查每一行,如果有这样的模式,preg_match_all()我会检查[download] (\d+)% of<?php $lines = file("t.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $numbers = array_filter(array_map(function($v){ if(preg_match_all("/\[download\] (\d+)% of/", $v, $m)) return $m[1][0]; else return false; }, $lines)); print_r($numbers); ?> 。如果它找到了我返回的数字,否则我返回false,最后我用array_filter() out过滤了带有false的元素。

Array ( [1] => 100 [3] => 100 )

输出:

.pricetag:before{
    position:absolute;
    content:"\25CF";
    color:white;
    text-shadow: 0 0 1px #333;
    font-size:11px;
    line-height:0px;
    text-indent:12px;
    left:-42px; // <-- increase this
    top: 0; // <-- add this
    width: 1px;
    height:0px;
    border-right:41px solid #E8EDF0;
    border-top:  43px solid transparent;
    border-bottom:  43px solid transparent;
}