所以我试图从日志文件中提取特定数据,例如日期,用户名和邮件本身。
这是模拟文件的样子:
[2017-03-14 11:48:22] Steve T: Hi!
[2017-03-14 11:49:01] Oscar: Hi! :D How are u doin?
[2017-03-14 11:50:24] Steve T: Im doing great :P
我可以使用preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $string, $matches)
提取日期,但如何使用正则表达式获取用户名和消息?
答案 0 :(得分:4)
这是一个有效的正则表达式:
/^\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] ([\w\s]+): (.+)$/gm
你可以在这里看到一个演示:https://regexr.com/3ntg7
它转换为:
^
- 行首\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]
- 方括号内的日期(必须转义)([\w\s]+)
- 用户名(混合使用单词(\w
)和空格(\s
)个字符)
([^:]+)
:
- 用户名后的冒号(匹配被丢弃)(.+)
- 匹配其他所有内容$
- 行尾这是一个PHP演示:https://3v4l.org/ovrt6
注意事项:
答案 1 :(得分:1)
使用格式化字符串的替代方法。
$str = <<<'EOD'
[2017-03-14 11:48:22] Steve T: Hi!
[2017-03-14 11:49:01] Oscar: Hi! :D How are u doin?
[2017-03-14 11:50:24] Steve T: Im doing great :P
EOD;
$handle = fopen("data://text/plain,$str", 'r');
while ( false !== $line = fgets($handle) ) {
print_r(sscanf($line, "[%[^]]] %[^:]: %[^\1]"));
}