2009-07-16 14 views
0

Ich muss Dhcp Leasing-Tabelle mit PHP Regex analysieren. aber die Sache ist es enthält verschiedene Zeichen in Regex auch verwendet.PHP Regex Problem mit einer komplexen Zielzeichenfolge

hier Beispielausgabe

lease 172.17.2.3 { 
    starts 4 2009/07/16 11:54:39; 
    ends 4 2009/07/16 12:54:39; 
    cltt 4 2009/07/16 11:54:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "\001\000PV\300\000\001"; 
    client-hostname "Yasin-PC"; 
} 
lease 172.17.2.3 { 
    starts 4 2009/07/16 12:24:39; 
    ends 4 2009/07/16 13:24:39; 
    cltt 4 2009/07/16 12:24:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "\001\000PV\300\000\001"; 
    client-hostname "Yasin-PC"; 
} 
lease 172.17.2.3 { 
    starts 4 2009/07/16 12:54:39; 
    ends 4 2009/07/16 13:54:39; 
    cltt 4 2009/07/16 12:54:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "\001\000PV\300\000\001"; 
    client-hostname "Yasin-PC"; 
} 

Problem ist, ich mit IP-Adressen nach dem Mietvertrag ..XX.XX.XX.XX indiziert gesamte Tabelle in ein Array zuweisen möchten {... & wird es doppelt Schlüssel aber Werte werden unterschiedlich sein, also muss ich das lösen, um ...

was würden Sie mir raten, meine Zeit zu sparen, um eine gute Regex dafür zu bauen? posix oder pcre oder Zeile für Zeile lesen?

& Ich kann nicht sicher sein, über Ziel-Leasing-Tabellen werden alle im selben Format sein. vielleicht mal ein paar Zeilen mehr, die ich erwarte.

+0

was sind die Dinge, die Sie bekommen, was Ihre endgültige Ausgabe aussehen? – ghostdog74

+0

3-dimensionales Array mit IP-Adresse indiziert ... Es wird ein Array mit diesen Schlüsseln enthalten mac-addr., Hostname, ein anderes Array enthält Start- und Endzeiten von Leases. Jetzt versuche ich Zeile für Zeile zu erreichen. Wenn ich fertig bin, werde ich als Antwort hinzufügen, damit jemand, der es finden und verwenden kann. danke für die seo-fähigkeiten von stackoverflow. Ich habe diese Website gefunden, während ich ein einfaches Funktionsskript gesucht habe. – risyasin

Antwort

1

Ich glaube, Sie könnten dies tun:

<?php 
$order_fields = array('starts', 'ends', 'cltt', 'binding state', 'next binding state', 'hardware ethernet', 'uid', 'client-hostname'); 
$fields_regexp = ''; 
foreach ($order_fields as $field) 
{ 
    $fields_regexp .= "\s*".$field." (.*)"; 
} 
$regexp = '/lease (\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b) \{'.$fields_regexp.'\s*\}/m'; 
preg_match_all($regexp, $string, $result, PREG_PATTERN_ORDER); 

$arr = array(); 
foreach ($result[1] as $i => $match) { 
    $cont = count($arr[$match]); 
    $arr[$match][$cont]['raw'] = $result[0][$i]; 
    $arr[$match][$cont]['ip'] = $match; 
    foreach ($order_fields as $pos => $field) 
    { 
     $arr[$match][$cont][$field] = $result[$pos + 2][$i]; 
    } 
} 
print_r($arr); 
?> 

Beispielausgabe:

Array 
(
    [172.17.2.3] => Array 
     (
      [0] => Array 
       (
        [raw] => lease 172.17.2.3 { 
    starts 4 2009/07/16 11:54:39; 
    ends 4 2009/07/16 12:54:39; 
    cltt 4 2009/07/16 11:54:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "�PVÀ�"; 
    client-hostname "Yasin-PC"; 
} 
        [ip] => 172.17.2.3 
        [starts] => 4 2009/07/16 11:54:39; 
        [ends] => 4 2009/07/16 12:54:39; 
        [cltt] => 4 2009/07/16 11:54:39; 
        [binding state] => active; 
        [next binding state] => free; 
        [hardware ethernet] => 00:50:56:c0:00:01; 
        [uid] => "�PVÀ�"; 
        [client-hostname] => "Yasin-PC"; 
       ) 

      [1] => Array 
       (
        [raw] => lease 172.17.2.3 { 
    starts 4 2009/07/16 12:24:39; 
    ends 4 2009/07/16 13:24:39; 
    cltt 4 2009/07/16 12:24:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "�PVÀ�"; 
    client-hostname "Yasin-PC"; 
} 
        [ip] => 172.17.2.3 
        [starts] => 4 2009/07/16 12:24:39; 
        [ends] => 4 2009/07/16 13:24:39; 
        [cltt] => 4 2009/07/16 12:24:39; 
        [binding state] => active; 
        [next binding state] => free; 
        [hardware ethernet] => 00:50:56:c0:00:01; 
        [uid] => "�PVÀ�"; 
        [client-hostname] => "Yasin-PC"; 
       ) 

      [2] => Array 
       (
        [raw] => lease 172.17.2.3 { 
    starts 4 2009/07/16 12:54:39; 
    ends 4 2009/07/16 13:54:39; 
    cltt 4 2009/07/16 12:54:39; 
    binding state active; 
    next binding state free; 
    hardware ethernet 00:50:56:c0:00:01; 
    uid "�PVÀ�"; 
    client-hostname "Yasin-PC"; 
} 
        [ip] => 172.17.2.3 
        [starts] => 4 2009/07/16 12:54:39; 
        [ends] => 4 2009/07/16 13:54:39; 
        [cltt] => 4 2009/07/16 12:54:39; 
        [binding state] => active; 
        [next binding state] => free; 
        [hardware ethernet] => 00:50:56:c0:00:01; 
        [uid] => "�PVÀ�"; 
        [client-hostname] => "Yasin-PC"; 
       ) 

     ) 

) 
+0

Vielen Dank ... ti funktioniert gut :) – risyasin

0

Sie könnten das genauso gut analysieren. Lesen Sie zeilenweise und behalten Sie den aktuellen Zustand in Variablen bei. Wenn Sie eine Zeile mit lease ... treffen und nicht in einer lease-Klausel sind, setzen Sie $inLease auf true und behandeln Sie die restlichen Zeilen als Parameter für die aktuelle lease, bis Sie die schließende Klammer } und so weiter drücken.

Reguläre Ausdrücke könnten Ihnen in diesem Fall helfen, aber es wird nicht schwieriger sein, nur eine einfache zeilenweise Analyse durchzuführen. Wenn man bedenkt, wie statisch das Datenformat ist, wären reguläre Ausdrücke dafür einfach übertrieben.

+0

es scheint, dass Ihr Weg besser ist, als ganze Datei zu analysieren. ich versuche es jetzt. Danke für die Antwort :) – risyasin