从字符串中提取用户名和消息?

时间:2018-04-14 12:41:42

标签: php regex

所以我试图从日志文件中提取特定数据,例如日期,用户名和邮件本身。

这是模拟文件的样子:

[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)提取日期,但如何使用正则表达式获取用户名和消息?

2 个答案:

答案 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]"));
}

demo