PHP Регулярное выражение для получения SSL-сертификата эмитента / субъекта - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь добиться следующего, но мне нужно использовать функцию preg_replace_callback () или в основном получить все данные в одном совпадении. Это возможно?

<?php

$pattern = '/([^\s]*?)\s=\s([^,]*?),/';

$string = "        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = RapidSSL RSA CA 2018";

preg_match_all( $pattern, $string, $matches );
$c = array_combine( $matches[1], $matches[2] );

print_r( $c );
Array
(
    [C] => US
    [O] => DigiCert Inc
    [OU] => www.digicert.com
)

PHP Fiddle: https://www.mycompiler.io/view/5CPWukk

Мне нужно что-то подобное, но с выводом, аналогичным приведенному выше:

  <?php
  $re = '/([^\s]*?)\s=\s([^,]*?),/';                                                                      
  $str = "        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = RapidSSL RSA CA 2018";
  preg_replace_callback ($re,   
          function ($matches) {
              var_dump($matches);              
              return null;      
          },                    
          $str
  );

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

preg_match_all извлекает все совпадения, в то время как внутри preg_replace_callback каждое совпадение извлекается индивидуально, один за другим.

Вам необходимо объявить переменную массива и передать ее обратному вызову, используя use инструкция с префиксом &, позволяющая обновить переменную:

$re = '/([^\s=]+)\s*=\s*([^,]*),/';                                                                      
$str = "        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = RapidSSL RSA CA 2018";
$arr = [];
$str = preg_replace_callback ($re,   
          function ($matches) use (&$arr) {
              $arr[$matches[1]] = $matches[2];
              return null;      
          },                    
          $str
);
print_r($arr); // => Array ( [C] => US [O] => DigiCert Inc [OU] => www.digicert.com )

См. PHP demo

Регулярное выражение немного улучшено для соответствия

  • ([^\s=]+) - Группа 1: любой один или несколько символов, кроме пробелов и = символов
  • \s*=\s* - символ =, заключенный в 0 или более пробелов
  • ([^,]*) - Группа 2: ноль или более символов, отличных от ,
  • , - запятая
0 голосов
/ 10 апреля 2020

Используйте PREG_SET_ORDER из preg_match_all

PHP Fidle: https://www.mycompiler.io/new/php?fork=5CPWukk

<?php

$pattern = '/([^\s]*?)\s=\s([^,]*?),/';
$string = "        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = RapidSSL RSA CA 2018";

preg_match_all( $pattern, $string, $matches , PREG_SET_ORDER);

print_r( $matches );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...