preg_match_all对字符串中的进程ID

时间:2015-02-22 21:19:50

标签: php regex preg-match-all

我试图从字符串中获取某些ID,但我无法让它工作。我得到了我在结果中没有预料到的价值观。

这就是我所拥有的:

<?php
$grep = ' 7027 ?        S      0:00 nginx: worker process                                          
 7632 ?        S      0:00 sh -c ps ax | grep nginx
 7634 ?        S      0:00 grep nginx
16117 ?        Ss     0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf';


if ( preg_match_all('~([0-9]+) \?(.*?)nginx:~si', $grep, $matches) )
{   
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
}

我在这里期待的是:~([0-9]+) \?(.*?)nginx:,它会匹配这两行:

7027 ?        S      0:00 nginx: worker process  
16117 ?        Ss     0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf';

我特别在他们的流程ID之后,在这种情况下:702716117

但我得到了:70277632

我的正则表达式应如何获取我想要的数据?

这是一个演示:http://codepad.viper-7.com/2R5OfF

1 个答案:

答案 0 :(得分:2)

s修饰符强制.匹配换行符序列。您需要删除它,然后您可以按如下方式简化正则表达式,以返回您之后的流程ID。

preg_match_all('~(\d+).*nginx:~i', $grep, $matches);
print_r($matches[1]);

输出

Array
(
    [0] => 7027
    [1] => 16117
)