Помогите с регуляркой

Тема в разделе "Регулярные выражения", создана пользователем Smile, 3 ноя 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Smile

    Smile

    Регистр.:
    12 ноя 2006
    Сообщения:
    157
    Симпатии:
    11
    Привет всем, помогите правильно написать регулярку.....

    есть много повторяющих строк:

    frame= 726 fps=207 q=25.0 size= 4183kB time=28.44 bitrate=1205.0kbits/s
    frame= 819 fps=204 q=25.0 size= 4785kB time=32.16 bitrate=1218.9kbits/s
    frame= 912 fps=202 q=25.0 size= 5344kB time=35.88 bitrate=1220.0kbits/s

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

    preg_match("/(frame=([^=]*) fps=[^=]* q=[^=]* L)?size=[^=]*kB time=([^=]*) bitrate=[^=]*kbits\/s[^=]*$/",$file,$out);

    всё работает отлично, но иногда строки немного меняются в след. чего выше написанное выражение не работает....

    изменившийся текст имеет след. вид:

    frame= 1429 fps=118 q=20.0 size= 8555kB time=56.56 bitrate=1239.1kbits/s dup=0 drop=284
    frame= 1493 fps=119 q=21.0 size= 8782kB time=59.12 bitrate=1216.9kbits/s dup=0 drop=296
    frame= 1547 fps=118 q=20.0 size= 9017kB time=61.28 bitrate=1205.5kbits/s dup=0 drop=307

    т.е. в конце добавляется dup=0 drop=307. Как сделать правильную регулярку чтоб работала и в тексте что с верху и в тексте что с низу? хелп
     
  2. zerdek

    zerdek

    Регистр.:
    29 ноя 2007
    Сообщения:
    346
    Симпатии:
    50
    я бы упростил регулярку.
    пробуй так:
    Код:
    preg_match("/time=([\d\.]*).*$/",$file,$out);
     
  3. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    456
    Такая регулярка у меня работает:
    Код:
    frame=\s*\d+\s+fps=\s*\d+\s+q=\s*[\d\.]+\s+size=\s*\d+kB\s+time=\s*([\d\.]+)\s+bitrate=\s*[\d\.]+kbits/s\s+(?:dup=\s*\d+\s+drop=\s*\d+|)
    Но вообще не понятно зачем в неё добавлять что-то, что идёт после искомого, т.е. более логично было бы использовать такую:
    Код:
    frame=\s*\d+\s+fps=\s*\d+\s+q=\s*[\d\.]+\s+size=\s*\d+kB\s+time=\s*([\d\.])
     
  4. Smile

    Smile

    Регистр.:
    12 ноя 2006
    Сообщения:
    157
    Симпатии:
    11

    берет time только из 1 строки... а нужно из последней... :( можно както запустить по циклу, или даже не знаю как это сделать... чтоб выводило последний найденный тайм...?

    Добавлено через 7 минут
    первая регулярка не работает, а вторая берет также только первый найденный time... а нужно последний...
     
  5. zerdek

    zerdek

    Регистр.:
    29 ноя 2007
    Сообщения:
    346
    Симпатии:
    50
    а так?
    Код:
    preg_match("/^.*time=([\d\.]*).*$/s",$file,$out);
     
    Smile нравится это.
Статус темы:
Закрыта.