dongquxiao8545 2015-02-22 21:19
浏览 48
已采纳

preg_match_all对字符串中的进程ID

I'm trying to get certain ids from a string, but I can't get it to work. I'm getting values that I'm not expecting in my result.

This is what I have:

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

What I'm expecting here with: ~([0-9]+) \?(.*?)nginx: is that it would match these two lines:

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

I'm specifically after their process id, in this case: 7027 and 16117.

But I'm getting: 7027 and 7632 instead.

How should my regex look to get the data that I want?

Here's a demo: http://codepad.viper-7.com/2R5OfF

  • 写回答

1条回答 默认 最新

  • donglun2024 2015-02-22 21:28
    关注

    The s modifier forces the . to match across newline sequences. You need to remove it and then you can simplify your regular expression as follows to return the process id's you're after.

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

    Output

    Array
    (
        [0] => 7027
        [1] => 16117
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题