2

我有一个巨大的文本文件,其中包含一些我想插入到我的数据库中的数据。问题是我不想插入每个数据,而且我似乎无法制作任何 preg_match_all(),事实上我是一个正则表达式的小新手:

文件.txt

[03-07-2010 09:03:23] : [180.20.106.107] : [/success]:
        [SEND] invite ->    helen, 
        [SEND] uname -> test, 
        [SEND] fname -> test, 

[03-07-2010 09:04:28] : [180.20.106.107] : [/success]:
        [SEND] invite ->    helen3, 
        [SEND] uname -> test3, 
        [SEND] fname -> test3, 
        [SEND] register ->  register, 

[03-07-2010 09:07:43] : [180.20.106.107] : [/success]:
        [SEND] invite ->    register, 
        [SEND] uname -> helen2, 
        [SEND] fname -> none, 

[03-07-2010 09:09:48] : [180.20.106.107] : [/success]:
        [SEND] invite ->    helen2, 
        [SEND] uname -> test2, 
        [SEND] fname -> test2, 

[03-07-2010 10:14:18] : [180.20.106.107] : [/success]:
        [SEND] invite ->    register, 
        [SEND] uname -> mickey, 
        [SEND] fname -> test8, 
        [SEND] register ->  register, 

我只想提取具有 的块register,这意味着从开始[03-07-2010 09:04:28]到结束register -> register,再到[03-07-2010 10:14:18]该块的末尾(register -> register)。

我尝试了很多东西,但就像我说的,我是正则表达式的新手

这不起作用:

#\[(.*)\] : \[(.*)\] : \[\/success\]:(.*)register ->    register#s
4

1 回答 1

2

有几个地方应该使用不贪婪的量词,但这不是问题。

问题是您正试图在另一条线上获取数据。除非您使用修饰符.明确告诉它,否则不匹配换行符。s

话虽如此,你不能用一个正则表达式来做到这一点,因为它将匹配具有时间戳和 IP 的第一行,然后一直跳到该register -> register行并说“哦,嘿,它有效!”

相反,我建议将您的主题字符串分成单独的块,如下所示:

$blocks = preg_split("/\r?\n\s*\r?\n/",$inputText);
foreach($blocks as $block) {
    list($first,$data) = explode("\n",$block,2);
    if( preg_match("/\bregister\s*->\s*register\b/",$data)) {
        preg_match_all("/\[(.*?)\]/",$first,$m,PREG_SET_ORDER);
        list($timestamp,$ip) = $m[0];
        // do something here with the information.
    }
}
于 2013-10-26T13:34:21.640 回答