公钥的正则表达式

时间:2016-03-04 16:38:55

标签: php regex

我想匹配文件中的键,如下所示:

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

我想通过preg_match_all从中减去KEY ID和密钥本身。我试过这个:

preg_match_all('/-----BEGIN PUBLIC KEY-----(.*)-----END PUBLIC KEY-----/', $ECDS_KEYS, $matches);

但是我得到了这个空阵列。你能帮我吗?感谢

3 个答案:

答案 0 :(得分:2)

默认情况下,“。”与换行符不匹配。您必须在正则表达式的末尾添加“s”才能捕获它:

preg_match_all('/-----BEGIN PUBLIC KEY-----(.*)-----END PUBLIC KEY-----/s', $ECDS_KEYS, $matches);

结果:https://regex101.com/r/rN7oZ1/1

修改

如果你想分开每个密钥,你不需要“preg_match_all”,你在第一次捕获之前和之后都不需要换行,并且你必须在正则表达式之后爆炸它:

// catch all keys
preg_match('/-----BEGIN PUBLIC KEY-----\n(.*)\n-----END PUBLIC KEY-----/s', $ECDS_KEYS, $groupedKeys);
// once you get a list of key, seperate them with an explode on linebreaks
$lonelyKeys = explode("\n", $groupedKeys[1]);

使用“\ n”或“\ r \ n”,具体取决于您收到的内容。

答案 1 :(得分:0)

如果您考虑到需要加载文件并使用正则表达式模式进行编译和搜索,您应该考虑采用另一种更快且使用更少内存的方法:

$fh = fopen($filename, 'r');

$start = "-----BEGIN PUBLIC KEY-----\n";
$end = "\n-----END PUBLIC KEY-----";
$maxSizeBetweenKeys = 262144;
$results = [];

while ( stream_get_line($fh, $maxSizeBetweenKeys, $start) !== false &&
        ($key = stream_get_line($fh, 4096, $end)) !== false )
    $results[] = $key;

fclose($fh);

如果将其与:

进行比较
$fileContent = file_get_contents($filename);
if (preg_match_all('~^-----BEGIN PUBLIC KEY-----\n\K.*+(?>\n.*)*?(?=\n-----END PUBLIC KEY-----)~m', $fileContent, $matches))
    $results = $matches[0];

有点短但速度慢。

答案 2 :(得分:0)

测试公钥和私钥的模式

(-----BEGIN PUBLIC KEY-----(\n|\r|\r\n)([0-9a-zA-Z\+\/=]{64}(\n|\r|\r\n))*([0-9a-zA-Z\+\/=]{1,63}(\n|\r|\r\n))?-----END PUBLIC KEY-----)|(-----BEGIN PRIVATE KEY-----(\n|\r|\r\n)([0-9a-zA-Z\+\/=]{64}(\n|\r|\r\n))*([0-9a-zA-Z\+\/=]{1,63}(\n|\r|\r\n))?-----END PRIVATE KEY-----)

测试 Regex101.com - PEM RSA KEY PATTERN - ECMASCRIPT - PCRE

enter image description here