使用php preg_match拆分日志数据

时间:2013-08-27 09:35:47

标签: php regex

我的任务是用PHP脚本分析日志文件。 我将使用REGEX来分割日志记录以进行进一步分析。 日志记录如下:

param1=val1;param2=val2;param3=val3;[int1Param1=int1Val1;int1Param2=int1Val2;][int2Param1=int2Val1;int2Param2=int2Val2;][int3Param1=int3Val1;int3Param2=int3Val2;]param4=val4;

所以,我有一套我必须分析的参数和值,我对这部分没有任何问题。 我关心的是“会话数据”,它位于param3和param4之间的方括号内。问题是我不知道我将在这部分中记录多少记录(在这部分中它可以是0或更多这样的记录)。 我正在使用以下正则表达式来识别这部分:

(\[[^\]\[]+\])*

它完美地识别“param3 = val3;”之间的完整字符串和“param4 = val4;”并将其作为preg_match的$ matches数组的“0”元素返回。我需要的是将所有这些括号作为数组元素,以进一步分析其内容,但$ matches只包含2个元素:“0” - 鲸鱼串; “1” - 最后“括号”。 有任何想法吗? 谢谢丹尼斯。

2 个答案:

答案 0 :(得分:0)

您可以在字符串上使用preg_match_all,如下所示:

preg_match_all("/\[[^][]+\]/", $log, $results);
print_r($results);

这导致:

Array
(
    [0] => Array
        (
            [0] => [int1Param1=int1Val1;int1Param2=int1Val2;]
            [1] => [int2Param1=int2Val1;int2Param2=int2Val2;]
            [2] => [int3Param1=int3Val1;int3Param2=int3Val2;]
        )
)

Demo here

答案 1 :(得分:0)

你能做什么:

$pattern = '~(?>(?<new>\[)|\G(?<!^))(?<key>[^]=]++)=(?<val>[^][;]++);~';
$subject = 'param1=val1;param2=val2;param3=val3;[int1Param1=int1Val1;int1Param2=int1Val2;][int2Param1=int2Val1;int2Param2=int2Val2;][int3Param1=int3Val1;int3Param2=int3Val2;]param4=val4;';

if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
    $i=0;    
    foreach ($matches as $match) {
        if ($match['new']) $i++;
        $result[$i][$match['key']]=$match['val'];
    }
    print_r($result);
}

模式说明:

~                 # pattern delimiter
(?>               # open an atomic group
    (?<new>\[)    # the named group "new" contains a possible "[". It's useful
                  # to know when a new content in square brackets begins.
  |               # or
    \G(?<!^)      # a match (that can't be at the start of the string)
                  # contiguous (\G) to a precedent match 
)                 # close the atomic group
(?<key>[^]=]++)   # named group "key"
=
(?<val>[^][;]++)  # named group "val"
;
~

原子组中的替代方案描述了可能性。第一个是[以匹配方括号内的第一对键/值。然后第二个(和其他)被迫与先前的匹配相邻可以成功。