我的任务是用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” - 最后“括号”。 有任何想法吗? 谢谢丹尼斯。
答案 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;]
)
)
答案 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"
;
~
原子组中的替代方案描述了可能性。第一个是[
以匹配方括号内的第一对键/值。然后第二个(和其他)被迫与先前的匹配相邻可以成功。