2016-03-04 168 views
0

我要匹配的密钥文件看起来像这样表达:定期对公共密钥

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

我想减去密钥ID,并通过preg_match_all从它的密钥本身。我试过这一个:

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

但我从这一个空阵列。你能帮我吗?谢谢

+0

我投票重新打开这个问题,因为我对这个特定的案件有一个答案,而不是重复的。 –

回答

1

默认情况下,“。”不符合换行符。你必须在你的正则表达式的结尾加上了“s”抓住它:

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

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

编辑:

如果你想单独的每个键,你不“T需要‘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”,具体取决于您收到的内容。

+0

你好,谢谢,但我也得到了另一个2键,当我使用这一个,我只有1匹配,我有所有3个键 –

+0

然后,你不能使用一个正则表达式。我编辑我的答案。 – Random

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]; 

这是有点短但速度较慢。