2013-10-23 57 views
-1

我有以下的输入数据(注意,一些空白的是越来越乱了):preg_match_all解析,只有一个匹配

aggr0_howzeg253_sata在线raid_dp,汇聚根,diskroot, nosnap =关,raidtype = raid_dp , 32位raidsize = 14,ignore_inconsistent =关, snapmirrored =关,resyncsnaptime = 60, fs_size_fixed =关,snapshot_autodelete =开, lost_write_protect =开,ha_policy = CFO, hybrid_enabled =关,percent_snapshot_space = 5%, free_space_rea LLOC =关

  Volumes: root_vol_howzeg253, howzeg253_ixb_esx_vol16_sv_mirror, 
        howzeg253_ixb_esx_vol5_sv_mirror, 
        howzeg253_ixb_esx_vol18_sv_mirror, 
        howzeg253_ixb_esx_vol21_sv_mirror, 
        howzeg253_ixb_esx_vol33_sv_mirror, 
        howzeg253_ixb_esx_vol24_sv_mirror, 
        howzeg253_ixb_esx_vol34_sv_mirror 

      Plex /aggr0_howzeg253_sata/plex0: online, normal, active 
       RAID group /aggr0_howzeg253_sata/plex0/rg0: normal, block checksums 
       RAID group /aggr0_howzeg253_sata/plex0/rg1: normal, block checksums 

aggr1_howzeg253_sata在线raid_dp,AGGR nosnap =关, raidtype = raid_dp,raidsize = 14, 32位ignore_inconsistent =关,snapmirrored =关, resyncsnaptime = 60,fs_size_fixed =关, snapshot_autodelete =开,lost_write_protect =开, ha_policy = CFO,hybrid_enabled =关, percent_snapshot_space = 5%, free_space_realloc =关

  Volumes: howzeg253_ixb_esx_vol6_sv_mirror, 
        howzeg253_ixb_esx_vol17_sv_mirror, 
        howzeg253_ixb_esx_vol7_sv_mirror, 
        howzeg253_ixb_esx_vol19_sv_mirror, 
        howzeg253_ixb_esx_vol23_sv_mirror, 
        howzeg253_ixb_esx_vol8_sv_mirror, 
        howzeg253_ixb_esx_vol36_sv_mirror 

      Plex /aggr1_howzeg253_sata/plex0: online, normal, active 
       RAID group /aggr1_howzeg253_sata/plex0/rg0: normal, block checksums 
       RAID group /aggr1_howzeg253_sata/plex0/rg1: normal, block checksums 

我用这个表达preg_match_all:

preg_match_all("|(aggr[a-z0-9_]+)\s+.*Volumes.\s+(.*)\s+Plex.*checksums|s", $rawdata, $out); 

不过,我只得到输出让我从第一个块中的信息(这似乎正确地分析;每个块以一行开头的aggr _...开始)。 我尝试了不同的方式,但无法得到我想要的东西(比如在表达式开始处的胡萝卜与s修饰符)。

所以这是输出I得到:

... 
[1] => Array 
    (
     [0] => aggr4_delng153_sas_sata 
    ) 

[2] => Array 
    (
     [0] => delng153_ixb_esx_vol19, delng153_ixb_esx_vol20, 
        delng153_ixb_esx_vol21, delng153_ixb_esx_vol28, 
        delng153_ixb_esx_vol29, delng153_ixb_esx_vol30, 
        delng153_ixb_esx_vol31 


    ) 

我想返回的第二块为好。 任何人都可以帮助我吗?

在此先感谢!

+0

为什么downvote? – th3penguinwhisperer

回答

0

试试这个:

preg_match_all("|(aggr[a-z0-9_]+)\s+.*Volumes.\s+(.*)\s+Plex.*checksums|sg", $rawdata, $out); 

全球g搜索标志使正则表达式搜索在整个字符串

0

兄弟我想你的模式正在寻找此

'/(aggr[a-z0-9_]+)\s.*?Volumes:(.*?)rg1: normal, block checksums/s' 
0

真的愚蠢的是我昨天晚上找不到它。 今天早上我看了5分钟,就像是:不,将会发布它。 5分钟后,我发现使用修饰符U它工作。 但是,我会研究您的建议解决方案。

看来Naveed的答案会回复很多(直到“block cheksums”这个单词为止),但是我可能是错的。