...
;
; 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);