Search code examples
phpsearchaptaptitude

Parse aptitude search using php


I'm building a UI using PHP and jquery that will allow someone to type in a string and it will search apt search

What i want to do is separate (using php) the packaga name, the architecture just after the / and the description of the package just below the line of the package and architecture so i can push this data into a JSON collection and return it to jQuery.

I'm doing the following command:

$data=shell_exec("sudo apt search $searchString")

I can get the package name and the architecture using explosion on / but dont know how to get the line below

Here's an example output of this search against php:

wwwconfig-common/bionic 0.3.0 all
  Debian web auto configuration

xine-ui/bionic 0.99.9-1.3 amd64
  the xine video player, user interface

xjed/bionic 1:0.99.19-7 amd64
  editor for programmers (x11 version)

xmlsysd/bionic 2.6.0-0ubuntu4 amd64
  wulfware daemon to extract data from cluster nodes

yasat/bionic 848-1ubuntu1 all
  simple stupid audit tool

yhsm-validation-server/bionic 1.2.0-1 all
  Validation server using YubiHSM

yrmcds/bionic 1.1.8-1.1 amd64
  memcached compatible KVS with master/slave replication

yubikey-server-c/bionic 0.5-1build3 amd64
  Yubikey validation server

yubikey-val/bionic 2.38-2 all
  One-Time Password (OTP) validation server for YubiKey tokens

zabbix-frontend-php/bionic 1:3.0.12+dfsg-1 all
  network monitoring solution - PHP front-end

zendframework/bionic 1.12.20+dfsg-1ubuntu1 all
  powerful PHP framework

zendframework-bin/bionic 1.12.20+dfsg-1ubuntu1 all
  binary scripts for zendframework

Thanks for the assistance!

UPDATE:

I can get the package name and the architecture using exploding "/" but i dont know how to get the line just below. Thought i can find a nifty solution


Solution

  • Here is a couple of ways to do it.

    One is using explode with array_map (you could use normal foreach instead) and the other way using regex.

    <?php
    $str = 'wwwconfig-common/bionic 0.3.0 all
      Debian web auto configuration
    
    ...';
      
      
    $packages = array_map(function($item) {
        
        $item = array_map('trim', explode("\n", trim($item)));
        $line = explode(" ", $item[0]);
        $line[0] = explode("/", $item[0]);
        
        return [
            'package' => $line[0][0],
            'distro' => $line[0][1],
            'version' => $line[1],  
            'arch' => $line[2], 
            'desc' => $item[1]
        ];
    }, explode("\n\r", $str));
    

    Or with regex,

    preg_match_all('#(?<package>.*?)/(?<distro>.*?) (?<version>.*?) (?<arch>.*?)\n  (?<desc>.*?)\n\r#', $str, $packages);
    $result = [];
    foreach ($packages['package'] as $key => $value) {
        $result[] =  [
            'package' => $packages['package'][$key],
            'distro' =>  $packages['distro'][$key],
            'version' =>  $packages['version'][$key],
            'arch' =>  $packages['arch'][$key],
            'desc' =>  $packages['desc'][$key]
        ];
    }
    
    print_r($result);
    

    Both produce the same result:

    Array
    (
        [0] => Array
            (
                [package] => wwwconfig-common
                [distro] => bionic
                [version] => 0.3.0
                [arch] => all
                [desc] => Debian web auto configuration
            )
    
        [1] => Array
            (
                [package] => xine-ui
                [distro] => bionic
                [version] => 0.99.9-1.3
                [arch] => amd64
                [desc] => the xine video player, user interface
            )
    
        [2] => Array
            (
                [package] => xjed
                [distro] => bionic
                [version] => 1:0.99.19-7
                [arch] => amd64
                [desc] => editor for programmers (x11 version)
            )
    
        [3] => Array
            (
                [package] => xmlsysd
                [distro] => bionic
                [version] => 2.6.0-0ubuntu4
                [arch] => amd64
                [desc] => wulfware daemon to extract data from cluster nodes
            )
    
        [4] => Array
            (
                [package] => yasat
                [distro] => bionic
                [version] => 848-1ubuntu1
                [arch] => all
                [desc] => simple stupid audit tool
            )
    
        [5] => Array
            (
                [package] => yhsm-validation-server
                [distro] => bionic
                [version] => 1.2.0-1
                [arch] => all
                [desc] => Validation server using YubiHSM
            )
    
        [6] => Array
            (
                [package] => yrmcds
                [distro] => bionic
                [version] => 1.1.8-1.1
                [arch] => amd64
                [desc] => memcached compatible KVS with master/slave replication
            )
    
        [7] => Array
            (
                [package] => yubikey-server-c
                [distro] => bionic
                [version] => 0.5-1build3
                [arch] => amd64
                [desc] => Yubikey validation server
            )
    
        [8] => Array
            (
                [package] => yubikey-val
                [distro] => bionic
                [version] => 2.38-2
                [arch] => all
                [desc] => One-Time Password (OTP) validation server for YubiKey tokens
            )
    
        [9] => Array
            (
                [package] => zabbix-frontend-php
                [distro] => bionic
                [version] => 1:3.0.12+dfsg-1
                [arch] => all
                [desc] => network monitoring solution - PHP front-end
            )
    
        [10] => Array
            (
                [package] => zendframework
                [distro] => bionic
                [version] => 1.12.20+dfsg-1ubuntu1
                [arch] => all
                [desc] => powerful PHP framework
            )
    
    )