PHP,正则表达式和解析游戏日志

时间:2011-12-14 09:23:45

标签: php regex parsing

INFO_MAP name:"mapname" version:"1.2.3"
INFO_SETTINGS mode:"Mode_Normal" options:"Option_None"
PLAYER_CONNECT player:0 name:"testname" id:1231231 psr:1000.00
PLAYER_TEAM_CHANGE player:0 team:2
ITEM_PURCHASE time:0 x:13906 y:13485 z:110 player:2 team:2 item:"Item_ItemName" cost:250
ABILITY_UPGRADE time:0 x:13906 y:13485 z:110 player:2 team:2 name:"Ability_Example1" level:1 slot:2
ITEM_PURCHASE time:0 x:13869 y:13740 z:110 player:1 team:2 item:"Item_AnotherItem" cost:100
PLAYER_CHAT player:3 target:"team" msg:"Test Message with Spaces"

我有这种风格的游戏日志,我必须通过PHP解析。哪种方法能够从这些方法中获得有用的东西,当前的strstr +爆炸系统实际上非常糟糕,由先前的开发人员编写。我正在考虑正则表达式,但无法得到任何工作。

2 个答案:

答案 0 :(得分:1)

这样的正则表达式应该有效:

^([^\s]+)(\s+([^:]+):("[^"]+"|[^\s]+))+

改变了一点PHP(适用于PHP版本5.1.6):

<?php
$pattern = '/([^\s]+)?(\s+([^:]+):("[^"]+"|[^\s]+))/';
$file_handle = fopen("logfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   preg_match_all($pattern, $line, $matches);
   print_r($matches);
}
fclose($file_handle);
?>

答案 1 :(得分:0)

我会逐行处理日志,使用substr获取第一个操作,然后使用explodepreg_match_all的函数处理其余操作。如果这正是其他程序员所做的,我认为他们做得很好。

也许我根本不会使用正则表达式,因为当你拥有真正的大型日志文件时效率很低。