How to parse fixed width column text in php?

How to parse and display below text in php and output it in hmtl?

What I need is a hint how to approach the spaces that separates the columns. The number of spaces is not fixed so I cannot use explode(" ",$string); And also I am not sure if the structure of below output has really fixed width columns. I want to make the parsing function generic.

The output comes from db2 list applications

Auth Id  Application    Appl.      Application Id                                                 DB       # of
         Name           Handle                                                                    Name    Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
DB2INST1 db2jcc_applica 11446      10.0.0.209.51406.120606004531                                  WEI      1    
DB2INST1 db2jcc_applica 11448      10.0.0.209.51407.120606004536                                  WEI      1    
DB2INST1 db2jcc_applica 13762      10.0.0.206.57473.120606024909                                  DOM_BUGS 1    
ADMIN    db2jcc_applica 15220      10.0.0.210.52248.120606045402                                  RATIONAL 1    
DB2INST1 php-fpm: pool  16546      127.0.0.2.35530.120606065726                                   KON      1    
DB2INST1 db2jcc_applica 16547      10.0.0.202.52042.120606065813                                  KON      1 

First of all, there was sscanf:

$vars = sscanf($string, '%s %s %d %s');

It is optimized for whitespace separated values, and you can specify the variable type already (%s = string; %d = integer)(; even name the variables but that is not demonstrated in the example).

Example/Demo:

$lines = explode("\r\n", $input);

foreach($lines as &$line)
{
    $line = sscanf($line, '%s %s %d %s');
}

var_dump($lines);

Output:

array(6) {
  [0]=>
  array(4) {
    [0]=>
    string(8) "DB2INST1"
    [1]=>
    string(14) "db2jcc_applica"
    [2]=>
    int(11446)
    [3]=>
    string(29) "10.0.0.209.51406.120606004531"
  }
  [1]=>
  array(4) {
    [0]=>
    string(8) "DB2INST1"
    [1]=>
    string(14) "db2jcc_applica"
    [2]=>
    int(11448)
    [3]=>
    string(29) "10.0.0.209.51407.120606004536"
  }
  [2]=>
  array(4) {
    [0]=>
    string(8) "DB2INST1"
    [1]=>
    string(14) "db2jcc_applica"
    [2]=>
    int(13762)
    [3]=>
    string(29) "10.0.0.206.57473.120606024909"
  }
  [3]=>
  array(4) {
    [0]=>
    string(5) "ADMIN"
    [1]=>
    string(14) "db2jcc_applica"
    [2]=>
    int(15220)
    [3]=>
    string(29) "10.0.0.210.52248.120606045402"
  }
  [4]=>
  array(4) {
    [0]=>
    string(8) "DB2INST1"
    [1]=>
    string(8) "php-fpm:"
    [2]=>
    NULL
    [3]=>
    NULL
  }
  [5]=>
  &array(4) {
    [0]=>
    string(8) "DB2INST1"
    [1]=>
    string(14) "db2jcc_applica"
    [2]=>
    int(16547)
    [3]=>
    string(29) "10.0.0.202.52042.120606065813"
  }
}

You can preg_split by space

$words = preg_split("/[\s]+/", $input);

//if your lines seperated by `\n` new line you could:
$inputArr = preg_split("/\R+/", $input);
foreach($inputArr as $value) {
   $out = preg_split("/\s+/", $value);
   var_dump($out);
}

Thanks

You could use preg_match on each data line as such:

preg_match('~^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$~', $line, &$matches);

This would return 1 if matched, 0 if not. And - more importantly - the column content in $matches, like the following:

array (
  0 => 'DB2INST1 db2jcc_applica 11446      10.0.0.209.51406.120606004531',
  1 => 'DB2INST1',
  2 => 'db2jcc_applica',
  3 => '11446',
  4 => '10.0.0.209.51406.120606004531',
)

The pattern simply matches sequences of non-whitespace separated by sequences of whitespace. So as long as there is no whitespace as part of the data itself, this should work on any random column length.