2012-02-13 3 views
0

Я использую следующее регулярное выражение с функцией preg_match в PHP для соответствия вывода команды df в Linux. Обратите внимание, что я использовал макрос define, чтобы упростить читаемость регулярного выражения.Regex on df output not working

define("MATCH_DF", 
    "/^(?P<filesystem>[0-9a-z\/]+)\s+" . 
    "(?P<blocks>[0-9]+)\s+" . 
    "(?P<used>[0-9]+)\s+" . 
    "(?P<avail>[0-9]+)\s+" . 
    "(?P<percent>[0-9]+%)\s+" . 
    "(?P<mount>[0-9a-zA-Z\/]+)\s+$/"); 

Для тех, кто не знает, то выход из командной строки df выглядит следующим образом ...

Filesystem  1K-blocks  Used Available Use% Mounted on 
/dev/sda2  236520176 2863468 221642116 2%/

Может кто-нибудь сказать мне, что я здесь отсутствует? Почему это не работает? Я сузил проблему до того, чтобы быть чем-то в своем регулярном выражении.

+1

Какой результат: 'preg_match()' дает вам? –

ответ

4

Вы ищете некоторые пробелы в конце строки, которых нет. Вы можете заменить квант + на *, чтобы сделать его необязательным или удалить все вместе.

Попробуйте это регулярное выражение ...

define("MATCH_DF", 
    "/^(?P<filesystem>[\da-z\/]+)\s+" . 
    "(?P<blocks>\d+)\s+" . 
    "(?P<used>\d+)\s+" . 
    "(?P<avail>\d+)\s+" . 
    "(?P<percent>\d+%)\s+" . 
    "(?P<mount>[\da-zA-Z\/]+)$/"); 

CodePad.

Я также поменял ваш [0-9] на \d.

Если вы хотите отказаться от цифровых спичек и просто держать именованные захватив группы ...

$matches = array_diff_key($matches, array_values($matches)); 

CodePad.

+0

+1 для глаз орла –

+0

@ Майкл Я надеюсь, что это лучше, чем [фильм] (http://www.imdb.com/title/tt1059786/) :). – alex

+0

Спасибо! Я смотрел на него в течение 12 минут подряд и никогда не замечал, что я оставил пространство на конце. –