0

我的任务是使用 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” - 最后一个“括号”。有任何想法吗?谢谢丹尼斯。

4

2 回答 2

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 a non-capturing 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"
;
~

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

于 2013-08-27T14:39:12.530 回答
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;]
        )
)

演示在这里

于 2013-08-27T10:09:13.917 回答