2016-12-02 7 views
3

Я используюРазбивает строку в столбце позиции

ps -l -u user 

, чтобы получить работу процессов данного пользователя.

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

Пока я могу обнаружить столбцы только по положению символов.

Есть ли способ в php разбивать строку на массив в определенных положениях? Что-то вроде:

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

отрезать нитку на куски в положениях 1, 10 и 14?

+0

'preg_match_all ('~^(.) (. {10}) (. {4}) ~ m', $ s, $ matches)'? –

+0

awk полезен здесь –

ответ

1

Я решил попробовать подход с регулярным выражением с динамическим построением шаблонов. Не уверен, что это лучший способ, но вы можете дать ему попробовать:

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

ВИДЕТЬ PHP demo

Дело:

  • Построение шаблона динамически, с помощью checkign индексов, вычитая предыдущее значение индекса из каждого последующего и добавив (.*)$ в конец, чтобы соответствовать остальной строке.
  • Модификатор m необходим для ^ в соответствии с началом линии и $ конец линии.
  • array_slice($arr, 1); удалит полное совпадение с полученным массивом.
  • Образец регулярного выражения (соответствие требованиям OP)) будет выглядеть ^(.{1})(.{9})(.{4})(.*)$
+0

Блестящий. Я немного изменяю его, чтобы соответствовать моим потребностям. Мне не нужен многомерный массив. – Juergen

0

В PHP preg_split поможет вам здесь. Вы можете разделить на несколько пробельных символах например .:

<? 
$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); 

Если вы знаете, количество колонок, то вы можете пройти через массив и принять, что число столбцов в одной строке.

+1

Я уже пробовал - конечно. Дело в том, что ps не дает результатов консистенции при разбиении на пробелы. Вы можете получить 12 элементов массива в строке и 15 в следующей строке. Например. зависит, если перечисленные команды в ps также содержат пробелы. – Juergen

+1

Тогда вы можете использовать ответ отсюда: http://stackoverflow.com/a/11071688/1768033 и создать формат, который соответствует вашим потребностям –

+0

Я посмотрю на него. Спасибо. – Juergen

1

Я изменил решение 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); 
} 
Смежные вопросы