【问题标题】:preg_match_all parsing, only one matchpreg_match_all 解析,只有一个匹配
【发布时间】:2013-10-23 07:34:26
【问题描述】:

我有以下输入数据(请注意,有些空格被弄乱了):

aggr0_howzeg253_sata online raid_dp, aggr root, diskroot, nosnap=off,raidtype=raid_dp, 32 位 raidsize=14,ignore_inconsistent=off, snapmirrored=off, resyncsnaptime=60, fs_size_fixed=off,snapshot_autodelete=on, lost_write_protect=on,ha_policy=cfo, hybrid_enabled=off, percent_snapshot_space=5%, free_space_realloc=off

            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 online raid_dp, aggr nosnap=off, raidtype=raid_dp,raidsize=14, 32 位 ignore_inconsistent=off,snapmirrored=off, resyncsnaptime=60,fs_size_fixed=off, snapshot_autodelete=on, lost_write_protect=on, ha_policy=cfo,hybrid_enabled=off, percent_snapshot_space=5%, free_space_realloc=off

            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 修饰符)。

所以这是我得到的输出:

...
[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


    )

我也希望返回第二个块。 有谁能帮帮我吗?

提前致谢!

【问题讨论】:

    标签: php regex match


    【解决方案1】:

    试试这个:

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

    全局 g 搜索标志使 RegExp 在整个字符串中搜索模式

    【讨论】:

      【解决方案2】:

      兄弟,我想你正在寻找这个

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

      【讨论】:

        【解决方案3】:

        我昨天晚上找不到它真是太愚蠢了。 今天早上我看了 5 分钟,然后说:不,会发布它。 5 分钟后,我发现使用修饰符 U 可以正常工作。 不过,我也会研究您提出的解决方案。

        似乎 Naveed 的回答会回归很多(阻止直到出现“阻止 cheksums”),但我可能错了。

        【讨论】:

          猜你喜欢
          • 2015-03-14
          • 2014-12-26
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-01
          相关资源
          最近更新 更多