2016-02-25 4 views
0

У меня есть файл с этой структурой:Распознавать массив или строку с регулярным выражением?

[25-02-2016 16:55:09.497203] [exception] SQLSTATE[42S02]: Base table or 
view not found: 1146 Table 'test.pdd_userss' doesn't exist 
    0: array(
     'Stack' => 'exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.pdd_userss' doesn't exist' in C:\Bitnami\wampstack-5.5.29-1\apache2\htdocs\api\v1\boot\core\database.php:57 
    Stack trace: 
    #0 C:\Bitnami\wampstack-5.5.29-1\apache2\htdocs\api\v1\boot\core\database.php(57): 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(158): 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(107): 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}', 
     'ID' => 'john foo' 
    ) 
[25-02-2016 16:55:09.497857] [info] Sistema executed. 
    0: array(
     'ID' => 'john foo' 
    ) 
[25-02-2016 16:55:13.255716] [info] System done. 

Теперь в течение первых двух случаев у меня нетых проблем для десериализации структуры как последуйте (первый два следа) третий след не распечатанный я ставлю это в пример является структура, которую я хочу достичь:

{ 
"trace": [2] 
0: { 
"date": "25-02-2016 17:02:31.830305" 
"type": "exception" 
"message": "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.pdd_userss' doesn't exist" 
"ID": "" <- THE ID ISN'T DISPLAYED 
}- 
1: { 
"date": "25-02-2016 17:02:31.831140" 
"type": "info" 
"message": "system done." 
"ID": "john foo" 
}- 
- 
.... OTHER CONTENT 
} 

но отображается «вызвать regex не десериализации данных для error ничего. Это мой код:

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

Как вы можете видеть, что в первом случае у меня есть массив как это:

0: array(
    'ID' => 'john foo' 

)

и Infact идентификатор отображается правильно, но в во втором случае у меня есть простая строка: 'ID' => 'john foo'

строка не отображается, так как я могу распознать этот два случая?

ответ

0

Я думаю, что все, что вы ищете простой is_array непосредственно перед регулярным выражением ... и после этого вы можете написать, если заявление для обработки, если это массив или нет ...

$content = array(); 
    $content["trace"] = array(); 

    if (is_array($regs)) { 
    // it's an array. 
    } else { 
    // not an array. 
    } 
    ...etc.... 

EDIT : Упс ... Я должен был сказать после регулярное выражение. Посмотрев на php docs, массив, который вы хотите, создается не позже.

preg_match_all('/\[(.*)\][\s]*?\[(.*?)\][\s]*?(.*)[\s.]+(?:\d+[^\']*\'ID\'[ ]*=>[ ]*\'(.*)\')?/', $fh, $regs, PREG_PATTERN_ORDER); 

    if (is_array($regs)) { 
    // it's an array. 
    } else { 
    // not an array. 
    } 
    ...etc.... 

Вы также можете попробовать

if (empty($regs[4][0])) {} 

и обрабатывать другой набор регулярных выражений оттуда.

+0

Извините за введение, но я думаю, что и с вашим состоянием проблема не исправлена ​​.. Регулярное задание – Dillinger

+0

обновленный ответ! – SoWizardly

+0

Проблема заключается в регулярном выражении не в 'array' – Sandokan

Смежные вопросы