我想匹配文件中的键,如下所示:
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);
但是我得到了这个空阵列。你能帮我吗?感谢
答案 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-----)