php - 文本文件到条件 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++;
}
}
解决方案
这是基于字符串操作的简单解决方案:
输入:
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
)
)
推荐阅读
- c# - AntiforgeryToken 在 ASP.NET Core 中是强制性的吗?
- java - 带有jdk 6的maven包
- node.js - 无法在 docker 中调试 nodejs 应用程序
- python-3.x - 如何使用与登录 Flask 站点相同的密码加密 pdf?
- python - 无法从 PyQT5 文本字段中获取文本
- excel - 为什么这个 Double 值比较不评估为真?
- python - 如何闪烁flask_socketio发出的消息?
- javascript - 语法错误:意外标识符 - 二进制算法代码。帮我改进一下
- excel - 绕过我的代码中 255 个字符限制的方法?
- vue.js - Bootstrap-vue:如何显示所选项目的文本?