Php 公钥的正则表达式

Php 公钥的正则表达式,php,regex,Php,Regex,我想匹配文件中的密钥,如下所示: KEY_ID: 1 STATUS: VALID -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ== -----END PUBLIC KEY----- 我想通过preg_match_all从中减去密钥ID和密钥本

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

KEY_ID: 1
STATUS: VALID
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaq6djyzkpHdX7kt8DsSt6IuSoXjp
WVlLfnZPoLaGKc/2BSfYQuFIO2hfgueQINJN3ZdujYXfUJ7Who+XkcJqHQ==
-----END PUBLIC KEY-----
我想通过preg_match_all从中减去密钥ID和密钥本身。我试过这个:

preg_match_all('/-----BEGIN PUBLIC KEY-----(.*)-----END PUBLIC KEY-----/', $ECDS_KEYS, $matches);
但我从这一个得到了空数组。你能帮我吗?谢谢默认情况下,“.”与换行符不匹配。您必须在正则表达式的末尾添加一个“s”来捕捉它:

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

编辑:

如果您希望分离每个关键点,则不需要“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”。

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

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

编辑:

如果您希望分离每个关键点,则不需要“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”,取决于所接收的内容。

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

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

这有点短但慢。

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

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

这稍微短一点,但速度较慢。

测试公钥和私钥的模式

(-----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-----)

测验


测试公钥和私钥的模式

(-----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-----)

测验


您好,谢谢,但我还有另外两把钥匙,当我使用这把钥匙时,我只得到一把匹配的钥匙,我有全部3把钥匙您好,谢谢,但我还有另外两个键,当我使用这一个时,我只有一个匹配,我有全部3个键。我投票重新打开这个问题,因为我有这个具体案例的答案,而不是重复。我投票重新打开这个问题,因为我有这个具体案例的答案,而不是重复。