2016-03-08 25 views
1

所以我有一个包含这一个.txt日志获取从一个文件中的特定动作的次数:通过输入姓氏只有

2015-10-02 11:06:15: P   performed by 'Bruce Wayne' 
2015-1-23 11:06:15: P   performed by 'Bruce Wayne' 
2015-11-06 9:06:15: S   performed by 'Peter Parker' 
2015-12-10 10:15:15: SAY   performed by 'Bruce Wayne' 
2015-9-10 10:06:15: SAY   performed by ' Wayne' 

他们中有些人没有一个名字,相反,他们有如上所示的空格。

2015-9-10 10:06:15: SAY   performed by ' Wayne' 

如何通过只输入姓氏来获得一个人所做的所有命令的计数?

实施例: 输入: 韦恩

输出: 或P指令已经由韦恩完成:3时间(s) SAY命令已经由韦恩完成:1周时间(s)

输入: 帕克

输出: S指令已经由Parker完成:1周时间(s)

竟被我d感谢一些帮助。我一直在努力做了一个多星期。

+0

什么,如果文本将包含几个男人用相同的姓氏?例如'布鲁斯韦恩','汤姆韦恩' - 命令是由不同的人做的 – RomanPerekhrest

+0

我不会发生。它全部被过滤 – Thenis

回答

1

使用preg_match_all

$surname = trim($surname); 

$pattern = " 
    /
    ^       # start of line 
    (\d{4}-\d{1,2}-\d{1,2})  # date 
    \s+       # one-or-more spaces 
    (\d{1,2}:\d{2}:\d{2}):  # hour 
    \s+       # one-or-more spaces 
    (\w+)      # one-or-more word chars 
    \s+       # one-or-more spaces 
    performed\sby\s    # “performed by ” 
    '       # single quote 
    ((.*?\s)?{$surname})  # optional (zero-or-more chars followed by a space) followed by “$surname” 
    '       # single quote 
    /xim 
"; 

preg_match_all($pattern, $text, $matches); 
print_r($matches); 

eval.in demo

单行模式版本:

/^(\d{4}-\d{1,2}-\d{1,2})\s+(\d{1,2}:\d{2}:\d{2}):\s+(\w+)\s+performed\sby\s'((.*?\s)?{$surname})'/im