2015-02-22 3 views
1

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

Это то, что у меня есть:

<?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'; 

Я специально после идентификатора процесса , в этом случае: 7027 и 16117.

Но я получаю: 7027 и 7632 вместо этого.

Как мое регулярное выражение должно получить данные, которые я хочу?

Вот демо: http://codepad.viper-7.com/2R5OfF

ответ

2

Модификатор s заставляет ., чтобы соответствовать по новой строки последовательности. Вам нужно удалить его, а затем вы можете упростить свое регулярное выражение, как показано ниже, чтобы вернуть идентификатор процесса.

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

Выход

Array 
(
    [0] => 7027 
    [1] => 16117 
) 
Смежные вопросы