通过php解析.txt文件中的公钥

时间:2016-02-01 19:30:49

标签: php

我有.txt文件,其中包含公钥列表及其ID和状态。存在一些"最佳实践"如何从.txt文件中基于KEY_ID中的KEY_ID提取其中一个公钥?

keys.txt

KEY_ID: 1
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp
WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ==
-----END PUBLIC KEY-----

KEY_ID: 2
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+Y5mYZL/EEY9zGji+hrgGkeoyccK
D0/oBoSDALHc9+LXHKsxXiEV7/h6d6+fKRDb6Wtx5cMzXT9HyY+TjPeuTg==
-----END PUBLIC KEY-----

KEY_ID: 3
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkvgJ6sc2MM0AAFUJbVOD/i34YJJ8
ineqTN+DMjpI5q7fQNPEv9y2z/ecPl8qPus8flS4iLOOxdwGoF1mU9lwfA==
-----END PUBLIC KEY-----

3 个答案:

答案 0 :(得分:2)

简化的正则表达式将涉及一个后视:

(?<=VALID\n)(.*\n){3}(-----END PUBLIC KEY-----)

这是EXAMPLE。对界面右上角发生的事情的解释对于理解正则表达式如何工作非常有价值。

积极的外观(你也可以使用负面的外观)来寻找其他东西之后的东西。在这种情况下,您需要在包含“VALID”(及其换行符)的行后面加上包含“----- END PUBLIC KEY -----”的最后一行的三行(及其换行符)。

你怎么能在代码中使用它?您将读取整个文件,然后将密钥解析为数组:

// read the file 
$keyfile = fopen("keys.txt", "r") or die("Unable to open file!");
$keycontents = fread($keyfile,filesize("keys.txt"));
fclose($keyfile);

$pattern_to_match = '/(?<=VALID\n)(.*\n){3}(-----END PUBLIC KEY-----)/';

// perform the match
preg_match_all($pattern_to_match, $keycontents, $keys, PREG_PATTERN_ORDER);

// view the array
echo "<pre>";
print_r($keys[0]);

我们在这里使用PREG_PATTERN_ORDER来确保$keys[0]是一个完整模式匹配数组,使每个数组元素成为文件中的一个键。

答案 1 :(得分:0)

您可以使用正则表达式:

<?php

$s = "KEY_ID: 1
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp
WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ==
-----END PUBLIC KEY-----

KEY_ID: 2
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+Y5mYZL/EEY9zGji+hrgGkeoyccK
D0/oBoSDALHc9+LXHKsxXiEV7/h6d6+fKRDb6Wtx5cMzXT9HyY+TjPeuTg==
-----END PUBLIC KEY-----

KEY_ID: 3
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkvgJ6sc2MM0AAFUJbVOD/i34YJJ8
ineqTN+DMjpI5q7fQNPEv9y2z/ecPl8qPus8flS4iLOOxdwGoF1mU9lwfA==
-----END PUBLIC KEY-----";

preg_match_all('/KEY_ID: (\d+)\s+STATUS: VALID\s+(-----BEGIN PUBLIC KEY-----[\s\S]+?-----END PUBLIC KEY-----)/', $s, $matches);
$id2key = array();
foreach ($matches[1] as $i => $id) {
    $key = $matches[2][$i];
    $id2key[$id] = $key;
}

print_r($id2key);

打印

Array
(
    [1] => -----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp
WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ==
-----END PUBLIC KEY-----
    [2] => -----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+Y5mYZL/EEY9zGji+hrgGkeoyccK
D0/oBoSDALHc9+LXHKsxXiEV7/h6d6+fKRDb6Wtx5cMzXT9HyY+TjPeuTg==
-----END PUBLIC KEY-----
    [3] => -----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkvgJ6sc2MM0AAFUJbVOD/i34YJJ8
ineqTN+DMjpI5q7fQNPEv9y2z/ecPl8qPus8flS4iLOOxdwGoF1mU9lwfA==
-----END PUBLIC KEY-----
)

答案 2 :(得分:0)

<?php
$keys = file_get_contents("keys.txt");
$keyid = 2;

if(($key = getKeyById($keyid, $keys)) !== null)
    echo "<pre>".$key."</pre>";
else
    echo "not found";

function getKeyById($id, $keys){
    if(preg_match("~KEY_ID: $id\s+STATUS: VALID\s+(-{5}BEGIN PUBLIC KEY-{5}.+?-{5}END PUBLIC KEY-{5})~s", $keys, $match)){
        $result = $match[1];

        return $result;
    }
    return null;
}
?>