PHP正则表达式无法匹配

PHP正则表达式无法匹配,php,regex,Php,Regex,我有一个巨大的文本文件,其中包含一些我想插入数据库的数据。 问题是,我不想插入所有数据,而且我似乎无法进行任何preg_match_all(),事实上,我对正则表达式有点陌生: file.txt [03-07-2010 09:03:23] : [180.20.106.107] : [/success]: [SEND] invite -> helen, [SEND] uname -> test, [SEND] fname -&g

我有一个巨大的文本文件,其中包含一些我想插入数据库的数据。 问题是,我不想插入所有数据,而且我似乎无法进行任何preg_match_all(),事实上,我对正则表达式有点陌生:

file.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, 
我只想提取具有
寄存器的块,这意味着从开始
[03-07-2010 09:04:28]
到结束
寄存器->寄存器,
[03-07-2010 10:14:18]
到该块的结尾(
寄存器->寄存器

我尝试了很多东西,但正如我所说,我是一个雷格克斯的新手

这不起作用:

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

有几个地方你应该使用不灵活的量词,但这不是问题所在

问题是您正试图从另一行获取数据<代码>
不匹配换行符,除非您使用
s
修饰符明确告诉它

这就是说,你不能用一个regexp来实现这一点,因为它会匹配第一行有时间戳和IP,然后一直跳到
寄存器->寄存器
行并说“哦,嘿,它工作了!”

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

$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.
    }
}

仅提取具有寄存器的单个块?或者提取包含寄存器的块?您期望的输出是什么?如果没有正确的开关,regex只搜索每行。