PHP – 从模式到另一个模式搜索文件行并将它们放入数组中

我有一个文本文件(实际上是一个区域文件),如下所示:

...
;
; base config
; -----------------------------------------------------------------
@       14400   IN      A       1.2.3.4
@       14400   IN      AAAA    1:2:3::4
;
; mail config
; -----------------------------------------------------------------
mail    14400   IN      A       1.2.3.4
mail    14400   IN      AAAA    1:2:3::4
@       14400   IN      MX 10   mail.example.com.
;
; www config
; -----------------------------------------------------------------
www     14400   IN      CNAME   example.com.
...

我想逐块解析每个没有注释掉的行到一个数组中.所以看起来应该是这样的:

$array = array(
    "base" => array(
        "0" => "@       14400   IN      A       1.2.3.4",
        "1" => "@       14400   IN      AAAA    1:2:3::4"
    ),
    "mail" => array (
        "0" => "mail    14400   IN      A       1.2.3.4",
        "1" => "mail    14400   IN      AAAA    1:2:3::4",
        "1" => "@       14400   IN      MX 10   mail.example.com."
    ),
    "www" => array(
        "0" => "www     14400   IN      CNAME   example.com."
    )
);

在这种情况下,评论是“;”所以它根本不需要解析.注释掉的部分是修复的,比如“基本配置”和“邮件配置”,而“www配置”没有改变,它每次都像我的例子一样.但是每个块中的记录(未通过;省略)可能会发生变化,因此可能只有1条记录,或5,10或任何记录.我试着把文本文件放到一个数组中,用foreach循环处理它,然后用preg_match()搜索相应的行但是它没有解决,因为我不知道有多少记录(行)到来文件的下一部分.她是我的尝试:

<?PHP
// Get lines
$lines = file('file.txt');

// Loop through our array
foreach ($lines as $line_num => $line) {
    if (preg_match("/\bbase config\b/i", $line)) {
        $line++
        // I don't kNow how to continue and find the next section
    }
}
?>

如果你可以帮助我处理一个块(基础,邮件或www),它将对我有所帮助,基于此,我可以解决其他问题.

解决方法:

另一种方法

<?PHP
$filepath = __DIR__ . '/file.txt';

$validSection = false;
$startingSectionPattern = '/^; [a-z]+ config$/i';
$startingSections = ['base' => '; base config', 'mail' => '; mail config', 'www' => '; www config'];
$res = [];

foreach (file($filepath, FILE_IGnorE_NEW_LInes | FILE_SKIP_EMPTY_LInes) as $line) {
    if ($line[0] == ';' && preg_match($startingSectionPattern, $line)) {
        $validSection = false;
        $key = array_search($line, $startingSections);
        if ($key !== false) {
            $validSection = true;
        }
    }

    if ($validSection && $line[0] != ';') {
        $res[$key][] = $line;
    }
}

var_dump($res);

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...