2016-07-25 25 views
0

, so habe ich ein paar Nagios CFG-Dateien, für Dienstleistungen, Hosts, Kontakte, etcPHP Machen Sie einen Array aus einer Textmuster (CFG-Datei)

ich diese CFG-Dateien mit PHP analysieren will Daten zu verarbeiten.

ContactGroups.CFG

define contactgroup { 
    contactgroup_name  VAP3 
    alias     VAP3_PRE 
    members     userz, userw } 

define contactgroup { 
    contactgroup_name  VAP4 
    alias     VAP4_PUSH 
    members     userx, usery } 

services.cfg

define service { 
    host_name      HostA 
    service_description    HostA_HD 
    contact_groups     VAP2,VAP3 } 

define service { 
    host_name      HostB 
    service_description    HostB_HD 
    contact_groups     VAP3,VAP4 } 

So will ich es analysieren mag:

contactgroup_name[0] = "VAP3"; 
alias[0] = "VAP3_PRE"; 
members [0] = "userz,userw"; 

contactgroup_name[1] = "VAP4"; 
alias[1] = "VAP4_PUSH"; 
members [1] = "userx, usery"; 

Und für Dienste-Datei:

host_name [0] = "HostA"; 
service_description [0] = "HostA_HD"; 
contact_groups [0] = "VAP2,VAP3"; 

host_name [1] = "HostB"; 
service_description [1] = "HostB_HD"; 
contact_groups [1] = "VAP3,VAP4"; 

, damit ich es in meinem PHP-Skript einfach wie Arrays umgehen kann, das ist nur ein Beispiel für die CFG-Dateien, sie enthält mehr als diese drei Definitionen ... Vielleicht mit einem regex oder preg_match ...?

+0

Erstellen Sie ein Array basierend auf den Namen, wenn es existiert, drücken Sie stattdessen die Daten - nur ein kurzer Gedanke. – Aaron

Antwort

0

in fast jeder halb-komplexen Sprache (in diesem Fall Ihre Konfiguration), hat das Parsen mit regulären Ausdrücken, die mehr als einem Token entsprechen, einige Randfälle, in denen es fehlschlägt.

Angenommen, Sie den naiven Ansatz nehmen und eine Objektdefinition mit

/define\s+([^\s]+){([^}]*)}/ 

diesen analysieren werden Sie zur Verfügung gestellt jede Kontaktgruppe oder Service Beispiel entsprechen und die Art in \1 und den Inhalt in \2 setzen. Wenn jedoch ein # in der Front ist, müssten Sie das herausfiltern. Sie sollten also wahrscheinlich alle Zeilen durchlaufen und die Kommentarzeilen vor entfernen, damit Sie die passenden Objektdefinitionen starten.

Danach würden Sie bemerken, dass weitere Kommentare erlaubt sind, wie ; comment, also würden Sie das auch filtern. Ich weiß nicht viel über erlaubte Zeichen, aber wenn ein Wert irgendwo eine gültige } enthält, sind Sie in Schwierigkeiten.

Wenn das nicht der Fall ist, könnte man wahrscheinlich die erste regexp bereitgestellt verwenden, als den Inhalt in Zeilen aufgeteilt und preg_split jede Zeile innerhalb einer Objektdefinition mit

/^\s*([^\s]+)\s+(.*)$/ 

, wo der Schlüssel in \1 ist und der Wert ist in \2, aber der Wert sollte wahrscheinlich trim ed sein.