首页 > 解决方案 > 文本文件到条件 php 数组

问题描述

我有一个包含数千个条目的文件,我试图将其转换为 PHP 数组,但是,我遇到了一个绊脚石,因为需要进入数组是有条件的。好消息是数据是可预测的,并且有两种类型的条目 1) 撤销 2) 有理由撤销

#1 的条目样本已撤销

    Serial Number: 0E76BE532946EFE890376F0339329A62
        Revocation Date: Jun 27 14:46:26 2018 GMT

#2 的条目示例已撤销,原因是

    Serial Number: 0E17C9648FF25C0FC537D97958E4D449
        Revocation Date: Jun 27 14:48:07 2018 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise

如果有理由撤销它总共有 5 行,否则只有 2 行。

数据文件data.txt示例

这是来自数千个条目列表的数据样本,我们可以将其用作样本数据文件。

    Serial Number: 0E76BE532946EFE890376F0339329A62
        Revocation Date: Jun 27 14:46:26 2018 GMT
    Serial Number: 0E17C9648FF25C0FC537D97958E4D449
        Revocation Date: Jun 27 14:48:07 2018 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise
    Serial Number: 06BB119BAA2ABC21F92B06ED8E14B113
        Revocation Date: Jun 27 14:49:12 2018 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise
    Serial Number: 088925C97AC5991CDF5416D07FC5DB00
        Revocation Date: Jun 27 15:50:51 2018 GMT
    Serial Number: 091E2B2090C7F5DBBCC97EA958B110BC
        Revocation Date: Jun 27 15:52:31 2018 GMT
    Serial Number: 0E6E9D1E9818221538EA6AF16A279C89
        Revocation Date: Jun 27 15:53:12 2018 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise
    Serial Number: 07852DF7D7DD35080DE3604836408ADE
        Revocation Date: Jun 27 15:53:38 2018 GMT
    Serial Number: 0DEA14237257A6A3049F934840DC2B47
        Revocation Date: Jun 27 15:53:40 2018 GMT
        CRL entry extensions:
            X509v3 CRL Reason Code: 
                Key Compromise

预期产出

我想用以下输出构建一个数组

Array
(
    [0] => Array
        (
            [serial] => 0E76BE532946EFE890376F0339329A62
            [date] => Jun 27 14:46:26 2018 GMT
        )

    [1] => Array
        (
            [serial] => 0E17C9648FF25C0FC537D97958E4D449
            [date] => Jun 27 14:48:07 2018 GMT
            [reason] => Key Compromise
        )
   ...
   ...
 )

尝试失败

这是我的尝试,仅考虑了第一个条件(#1)。对于(#2),它有额外的行,但无法弄清楚如何将它们考虑在内。

$arr = array();
$lines = file('data.txt', FILE_IGNORE_NEW_LINES);
$x = 0;
foreach ($lines as $line) {
    if (strpos($line, 'Serial Number: ') !== false) {
        $arr[$x]['serial'] = str_replace('Serial Number: ', '', trim($line)) ;
    }
    if (strpos($line, 'Revocation Date: ') !== false) {
        $arr[$x]['date'] = str_replace('Revocation Date: ', '', trim($line)) ;
        $x++;
    }
}

标签: php

解决方案


这是基于字符串操作的简单解决方案:

输入:

Serial Number: 0E76BE532946EFE890376F0339329A62
    Revocation Date: Jun 27 14:46:26 2018 GMT
Serial Number: 0E17C9648FF25C0FC537D97958E4D449
    Revocation Date: Jun 27 14:48:07 2018 GMT
    CRL entry extensions:
        X509v3 CRL Reason Code: 
            Key Compromise
Serial Number: 06BB119BAA2ABC21F92B06ED8E14B113
    Revocation Date: Jun 27 14:49:12 2018 GMT
    CRL entry extensions:
        X509v3 CRL Reason Code: 
            Key Compromise
Serial Number: 088925C97AC5991CDF5416D07FC5DB00
    Revocation Date: Jun 27 15:50:51 2018 GMT
Serial Number: 091E2B2090C7F5DBBCC97EA958B110BC
    Revocation Date: Jun 27 15:52:31 2018 GMT
Serial Number: 0E6E9D1E9818221538EA6AF16A279C89
    Revocation Date: Jun 27 15:53:12 2018 GMT
    CRL entry extensions:
        X509v3 CRL Reason Code: 
            Key Compromise
Serial Number: 07852DF7D7DD35080DE3604836408ADE
    Revocation Date: Jun 27 15:53:38 2018 GMT
Serial Number: 0DEA14237257A6A3049F934840DC2B47
    Revocation Date: Jun 27 15:53:40 2018 GMT
    CRL entry extensions:
        X509v3 CRL Reason Code: 
            Key Compromise

PHP代码:

<?php
// Extract the lines.
$file = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

//
$output = array();
foreach ($file as $row) {
    if (strpos($row, "Serial Number") === false) {
        $n = (count($output)-1);
        if (strpos($row, "Revocation Date") !== false) {
            $date = $row;
            $date = str_replace('Revocation Date: ', ' ', $date);
            $output[$n]['date'] = $date;
        } else if (strpos($row, "CRL entry extensions") !== false) {
        } else if (strpos($row, "X509v3 CRL Reason Code") !== false) {
        } else {
            $output[$n]['reason'] = $row;
        }   
    } else {
        $sn = $row;
        $sn = str_replace('Serial Number: ', ' ', $sn);
        $output[] = array();
        $n = (count($output)-1);
        $output[$n]['serial'] = $sn;
        $n++;
    }   
    echo $row.'</br>';
}

print_r($output);
?>

输出:

Array ( 
    [0] => Array ( 
        [serial] => 0E76BE532946EFE890376F0339329A62 
        [date] => Jun 27 14:46:26 2018 GMT 
    ) 
    [1] => Array ( 
        [serial] => 0E17C9648FF25C0FC537D97958E4D449 
        [date] => Jun 27 14:48:07 2018 GMT 
        [reason] => Key Compromise 
    ) 
    [2] => Array ( 
        [serial] => 06BB119BAA2ABC21F92B06ED8E14B113 
        [date] => Jun 27 14:49:12 2018 GMT 
        [reason] => Key Compromise 
    ) 
    [3] => Array ( 
        [serial] => 088925C97AC5991CDF5416D07FC5DB00 
        [date] => Jun 27 15:50:51 2018 GMT 
    ) 
    [4] => Array ( 
        [serial] => 091E2B2090C7F5DBBCC97EA958B110BC 
        [date] => Jun 27 15:52:31 2018 GMT
    ) 
    [5] => Array (
        [serial] => 0E6E9D1E9818221538EA6AF16A279C89 
        [date] => Jun 27 15:53:12 2018 GMT 
        [reason] => Key Compromise
    ) 
    [6] => Array ( 
        [serial] => 07852DF7D7DD35080DE3604836408ADE 
        [date] => Jun 27 15:53:38 2018 GMT
    ) 
    [7] => Array (
        [serial] => 0DEA14237257A6A3049F934840DC2B47 
        [date] => Jun 27 15:53:40 2018 GMT 
        [reason] => Key Compromise
    )
)

推荐阅读