Php 在列位置拆分字符串

Php 在列位置拆分字符串,php,regex,ps,Php,Regex,Ps,我正在使用 ps -l -u user 获取给定用户正在运行的进程 现在,当我想用PHP将信息拆分成数组时,我遇到了麻烦,因为ps输出数据供人们阅读,而不需要固定的分隔符。所以不能将空格或制表符作为正则表达式拆分 到目前为止,我只能通过字符位置检测列 在php中,有没有任何方法可以在特定位置将字符串拆分为数组?比如: $array=split_columns($string, $positions=array(1, 10, 14)) 在PHP preg_split中,在位置1、10和14处将

我正在使用

ps -l -u user
获取给定用户正在运行的进程

现在,当我想用PHP将信息拆分成数组时,我遇到了麻烦,因为
ps
输出数据供人们阅读,而不需要固定的分隔符。所以不能将空格或制表符作为正则表达式拆分

到目前为止,我只能通过字符位置检测列

在php中,有没有任何方法可以在特定位置将字符串拆分为数组?比如:

$array=split_columns($string, $positions=array(1, 10, 14))

在PHP preg_split中,在位置1、10和14处将字符串切成碎片将对您有所帮助。您可以按多个空格分隔,例如:

<?
$text = '501   309     1     4004   0   4  0  2480080  10092 -      S                   0 ??         0:36.77 /usr/sbin/cfpref
  501   310     1 40004004   0  37  0  2498132  33588 -      S                   0 ??         0:23.86 /usr/libexec/Use
  501   312     1     4004   0  37  0  2471032   8008 -      S                   0 ??        19:06.48 /usr/sbin/distno';
$split = preg_split ( '/\s+/', $text);
print_r($split);

我决定尝试一种带有动态模式构建的正则表达式方法。不确定这是最好的方式,但您可以尝试一下:

function split_columns ($string, $indices) {
    $pat =  "";
    foreach ($indices as $key => $id) {
        if ($key==0) { 
            $pat .= "(.{" . $id . "})";
        } else if ($key<count($indices)) {
            $pat .= "(.{" . ($id-$indices[$key-1]) . "})";
        }
    }
    $pats = '~^'.$pat.'(.*)$~m';
    preg_match_all($pats, $string, $arr);
    return array_slice($arr, 1);
}
$string = "11234567891234567\n11234567891234567"; // 1: '1', 2: '123456789', 3: '1234', 4: '567'
print_r (split_columns($string, $positions=array(1, 10, 14)));
函数拆分_列($string,$index){
$pat=“”;
foreach($索引为$key=>$id){
如果($key==0){
$pat.=“(.{.$id.})”;

}如果($key我修改了Wiktor的解决方案,因为我不需要那么多信息

function split_columns ($string, $indices) {
    $pat =  "";
    foreach ($indices as $key => $id) {
        if ($key==0) { 
            $pat .= "(.{" . $id . "})";
        } else if ($key<count($indices)) {
            $pat .= "(.{" . ($id-$indices[$key-1]) . "})";
        }
    }
    $pats = '~^'.$pat.'(.*)$~m';
    preg_match_all($pats, $string, $arr, PREG_SET_ORDER);
    $arr=$arr[0];
    return array_slice($arr, 1);
}
函数拆分_列($string,$index){
$pat=“”;
foreach($索引为$key=>$id){
如果($key==0){
$pat.=“(.{.$id.})”;

}else如果($key
preg_match_all('~^(.{10})(.{4})~m',$s,$matches)
?awk在这里很有用,我已经尝试过了——当然。重点是ps在用空格拆分时不会给出一致性结果。您可以在一行中得到12个数组元素,在下一行中得到15个。例如,取决于ps中列出的命令是否也包含空格。然后您可以使用此处的答案:并创建一种适合您的格式needs我会看一看的。谢谢。太棒了。我对它做了一些修改以满足我的需要。我不需要多维数组。