【问题标题】:PHP Make an Array from a Text Pattern (cfg file)PHP 从文本模式创建一个数组(cfg 文件)
【发布时间】:2016-07-25 21:09:07
【问题描述】:

所以我有几个 Nagios CFG 文件,用于服务、主机、联系人等

我想用 PHP 解析这些 CFG 文件来处理数据。

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 }

所以我想像这样解析它:

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

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

对于服务文件:

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";

所以我可以像数组一样在我的 PHP 脚本中轻松处理它,这些只是 CFG 文件的一个示例,它们包含的不仅仅是这三个定义...也许使用正则表达式或 preg_match...?

【问题讨论】:

  • 根据名称创建一个数组,如果存在则推送数据 - 快速思考一下。

标签: php parsing nagios


【解决方案1】:

在几乎每一种半复杂的语言(在这种情况下是您的配置)中,通过匹配多个标记的正则表达式进行解析都会出现一些会失败的边缘情况。

假设您将采用幼稚的方法并使用

解析对象定义
/define\s+([^\s]+){([^}]*)}/

这将匹配您提供的每个联系人组或服务示例,并将类型放入 \1 并将内容放入 \2。但是,如果前面有 #,则必须将其过滤掉。因此,您可能应该循环遍历所有行并删除注释行,开始匹配对象定义之前。

之后您会注意到,允许使用更多的 cmets,例如 ; comment,因此您也可以将其过滤掉。我对允许的字符了解不多,但如果某处的某个值可能有效地包含},那么你就有麻烦了。

如果不是这样,您可能可以使用提供的第一个正则表达式,而不是将内容分成几行,preg_split 对象定义中的每一行都使用

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

其中键在\1 中,值在\2 中,但值可能应该是trimed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多