在PHP中解析程序输出

时间:2016-05-09 02:19:42

标签: php regex

我有一个名为HDClone的程序,我正在尝试从驱动器列表中解析它的输出,以便在另一个程序中用于自动化。

HDClone产生以下输出:

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

我需要制作的内容如下:

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

任何人都有任何想法如何实现这一目标?

提前感谢您的任何帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

test.TestMethod<From, To>(to => to.Prop1);

它会找到(drv:\d+)[^[]+(\[[^]]+\]) 后跟数字,然后将其放入drv:。然后它会忽略$1之前的所有内容并捕获它以及[之前的所有内容。

您的代码可能如下所示:

]

答案 1 :(得分:1)

如果它是一个字符串尝试类似的东西(未经测试):

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

如果没有,请事先将其合并(例如内爆)。

答案 2 :(得分:1)

如果格式一致,您应该可以运行类似:

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

演示:https://regex101.com/r/eR0yK9/2