2016-05-09 12 views
1

Ich habe ein Programm namens HDClone, und ich versuche, es von Laufwerksauflistungen zu analysieren, um in einem anderen Programm für die Automatisierung zu verwenden.Parse-Programm-Ausgabe in PHP

HDClone erzeugt die folgende Ausgabe:

HDClone 6 Enterprise Edition 
Serial: 1111111111 

Miray Software AG 
Gaissacher Str. 18 
81371 Munich 
Germany 

Detecting drives. 
drv:0  Name: WDC WD40EZRZ-00WN9B0 (4,000,754 MB) 
      Serial: WD-WCC4E0ESU7YK 
      Port: 0/1/1/0 
      [ -, M:, X: ] 
To specify this drive, use the following parameters: 
-srcdrv:/-dstdrv:0 
-srcdrvn:/-dstdrvn:"WDC WD40EZRZ-00WN9B0" 
-srcdrvn:/-dstdrvn:"WDC WD40EZRZ-00WN9B0WD-WCC4E0ESU7YK" 
-srvdrvp:/-dstdrvp:0/1/1/0 

drv:1  Name: ST2000DM001-1CH164 (2,000,399 MB) 
      Serial: S1E1GA0V 
      Port: 0/1/1/1 
      [ S:, T: ] 
To specify this drive, use the following parameters: 
-srcdrv:/-dstdrv:1 
-srcdrvn:/-dstdrvn:ST2000DM001-1CH164 
-srcdrvn:/-dstdrvn:ST2000DM001-1CH164S1E1GA0V 
-srvdrvp:/-dstdrvp:0/1/1/1 

drv:2  Name: ST2000DM001-1CH164 (2,000,399 MB) 
      Serial: S1E1GC0Z 
      Port: 0/0/0/1 
      [ B:, P: ] 
To specify this drive, use the following parameters: 
-srcdrv:/-dstdrv:2 
-srcdrvn:/-dstdrvn:ST2000DM001-1CH164 
-srcdrvn:/-dstdrvn:ST2000DM001-1CH164S1E1GC0Z 
-srvdrvp:/-dstdrvp:0/0/0/1 

drv:3  Name: WDC WD10EADS-11M2B2 (1,000,205 MB) 
      Serial: WD-WCAV5D430071 
      Port: 0/0/2/0 
      [ -, V: ] 
To specify this drive, use the following parameters: 
-srcdrv:/-dstdrv:3 
-srcdrvn:/-dstdrvn:"WDC WD10EADS-11M2B2" 
-srcdrvn:/-dstdrvn:"WDC WD10EADS-11M2B2WD-WCAV5D430071" 
-srvdrvp:/-dstdrvp:0/0/2/0 

drv:4  Name: KINGSTON SMS200S360G (60,023 MB) 
      Serial: 50026B72440A6EE7 
      Port: 0/1/3/0 
      [ C: ] 
To specify this drive, use the following parameters: 
-srcdrv:/-dstdrv:4 
-srcdrvn:/-dstdrvn:"KINGSTON SMS200S360G" 
-srcdrvn:/-dstdrvn:"KINGSTON SMS200S360G50026B72440A6EE7" 
-srvdrvp:/-dstdrvp:0/1/3/0 

Was muss ich produzieren ist eine Auflistung, wie:

drv:0,[-,M:,X:] 
drv:1,[S:,T:] 
drv:2,[B:,P:] 
drv:3,[-,V:] 
drv:4,[C:] 

Wer irgendwelche Ideen, wie dies zu erreichen?

Vielen Dank im Voraus für jede Hilfe.

+0

Es gibt eine Menge consistant, aber jedes Laufwerk hat eine sehr individuelle Details, die ich bin nicht sicher, wie man herumkommen. Jeder hat den Namen :, Seriell :, Port :, dann das Angeben dieses Laufwerks –

+0

Das funktioniert für die ersten, aber verpasst die letzte. Danke für die Hilfe. –

+0

Das hat es getan !! –

Antwort

1

Wenn das Format stimmt, sollten Sie so etwas wie der Lage sein, laufen:

/^(drv:\d+)(?:[\s\S]+?(?:Name|Serial|Port):.*$){3}\n\h*(\[[^\]]+?])/m 

Demo: https://regex101.com/r/eR0yK9/2

+0

Ich mag das ist ist streng, um sicherzustellen, dass es nur von Anfang an zieht, so dass wir nichts verpassen. Vielen Dank –

1

können Sie diese Regex verwenden:

(drv:\d+)[^[]+(\[[^]]+\]) 

Es drv: gefolgt von Zahlen findet und dass in $1 gestellt wird. Dann ignoriert es alles bis auf [ und fängt es und alles bis auf ].

Code könnte wie folgt aussehen:

$re = "/(drv:\\d+)[^[]+(\\[[^]]+\\])/mi"; 
$str = "your string"; 
preg_match_all($re, $str, $matches); 
+0

Perfekt, danke !! –

1

Wenn es eine Zeichenfolge versuchen so etwas ist (nicht getestet):

$output = []; 
preg_match_all('#(drv:\d+)(^\[)+(\[(^\])+\])#ism', $string, $matches); 
foreach ($matches as $match) { 
    $output[] = $match[1].$match[3]; 
} 

Wenn nicht, kombinieren (zB implodieren) und zuvor .

+0

Das funktioniert auch perfekt, danke !! –