我有一个巨大的文本文件,其中包含我要在数据库中插入的一些数据。 问题是我不想插入每个数据,而且我似乎无法制作任何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,
我想只提取具有register
的块,这意味着从开始[03-07-2010 09:04:28]
到结束register -> register,
和[03-07-2010 10:14:18]
到该块的结尾({ {1}})。
我尝试了很多东西,但就像我说的那样,我是正则表达式的新手
这不起作用:
register -> register
答案 0 :(得分: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.
}
}