正则表达式无法获取堆栈跟踪


Regex fail to get the stack trace

我有一个具有此结构的文件:

[19-02-2016 16:57:17.104504] [info] system done. 
 0: array(
   'ID' => 'john foo'
 )
[19-02-2016 16:57:17.110482] [info] transaction done. 
[25-02-2016 10:44:16.132093] [error] Errore 
0: array(
      'Trace' => 'exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'primo_db.primo_userss' doesn't exist' in C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'database.php:44
   Stack trace:
   #0 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'database.php(44): PDO->prepare('SELECT * FROM p...')
   #1 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'models'tests_model.php(31): Database->select('SELECT * FROM p...')
   #2 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'controllers'test.php(43): Tests_Model->selectData()
   #3 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'router.php(159): Test->selectUser()
   #4 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'map.php(52): Router->submit()
   #5 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'system'api.php(110): Map->init_get()
   #6 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'boot.php(21): Api->init()
   #7 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'index.php(18): Boot->__construct()
   #8 {main}'
   )

现在对于前两种情况,我对反序列化结构没有问题,如下所示(前两条跟踪)第三条跟踪未打印我把它放在示例中是我想要实现的结构:

"trace":[
{
    "date":"19-02-2016 16:57:17.104504",
    "type":"info",
    "message":"system done.",
    "ID":"john foo"
},
{
    "date":"19-02-2016 16:57:17.110482",
    "type":"info",
    "message":"transaction done.",
    "ID":""
 },
 { 
    "date":"25-02-2016 10:44:16.132093",
    "type":"error",
    "message" : "'exception 'PDOException' with message 
'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'primo_db.primo_userss' doesn't exist' in C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'database.php:44"
    "stack": "#0 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'database.php(44): PDO->prepare('SELECT * FROM p...')
   #1 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'models'tests_model.php(31): Database->select('SELECT * FROM p...')
   #2 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'controllers'test.php(43): Tests_Model->selectData()
   #3 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'router.php(159): Test->selectUser()
   #4 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'core'map.php(52): Router->submit()
   #5 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'system'api.php(110): Map->init_get()
   #6 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'boot'boot.php(21): Api->init()
   #7 C:'Bitnami'wampstack-5.5.29-1'apache2'htdocs'api'v1'index.php(18): Boot->__construct()
   #8 {main}'"
 }
]

但是对于error,不会显示任何内容,因为regex无法反序列化数据。这是我的代码:

 $fh = file_get_contents($file);
 if(!$fh) { throw new Exception("Not found"); }
 $content = array(); 
 $content["trace"] = array();
 preg_match_all('/'[(.*)']['s]*?'[(.*?)']['s]*?(.*)['s.]+(?:'d+[^'']*''ID''[ ]*=>[ ]*''(.*)'')?/',
 $fh, $regs, PREG_PATTERN_ORDER);
 for($i = 0; $i < count($regs[0]); $i++)
 {
       $content['trace'][] = array(
       'date'    => $regs[1][$i],
       'type'    => trim($regs[2][$i]),
       'message' => trim($regs[3][$i]),
        'ID'      => trim($regs[4][$i]),
            );
  }
  return $content;

如何解决此问题?'因为error一般意味着有一个包含堆栈跟踪内容的数组。

您可以尝试以下递归模式:

/'[(?<date>[^]]*)']'h*'[(?<type>[^]]*)']'h*(?<msg>[^'r'n]*)(?:'R'h*'d+:'h*array(?<message>'((?:[^()]*|(?-1))*')))?/s

正则表达式演示

PS:它将在最后捕获的组中提供额外的) 'Trace' => ',您可以通过后期处理将其删除。