Php 匹配插入sql查询的正则表达式模式

Php 匹配插入sql查询的正则表达式模式,php,regex,Php,Regex,我有一些日志文件,其中包含许多类似的行: [26-Nov-2010 07:33:08] query error: INSERT INTO members (id,name,member_login_key,email,mgroup,posts,joined,ip_address,time_offset,view_sigs,email_pm,view_img,view_avs,restrict_post,view_pop,msg_total,new_msg,coppa_user,language,

我有一些日志文件,其中包含许多类似的行:

[26-Nov-2010 07:33:08] query error: INSERT INTO members (id,name,member_login_key,email,mgroup,posts,joined,ip_address,time_offset,view_sigs,email_pm,view_img,view_avs,restrict_post,view_pop,msg_total,new_msg,coppa_user,language,dst_in_use,allow_admin_mails,hide_email,subs_pkg_chosen,members_l_username,members_l_display_name, item_id, members_display_name)
                                        VALUES(8416961,'abc','3857b123a1a67ce1fc4a39fd7ae47355','test@email.com',1,0,1290756788,'127.0.0.1','',1,1,1,1,
                    0,1,0,0,0,'',0,1,0,0,'abc','abc',
                                        '0', 'abc');|http://www.example.com/|Duplicate entry '8388607' for key 1
[26-Nov-2010 08:33:08] query error: INSERT INTO members (id,name,member_login_key,email,mgroup,posts,joined,ip_address,time_offset,view_sigs,email_pm,view_img,view_avs,restrict_post,view_pop,msg_total,new_msg,coppa_user,language,dst_in_use,allow_admin_mails,hide_email,subs_pkg_chosen,members_l_username,members_l_display_name, item_id, members_display_name)
                                        VALUES(8416962,'abc','3857b123a1a67ce1fc4a39fd7ae47355','test@email.com',1,0,1290756788,'127.0.0.1','',1,1,1,1,
                    0,1,0,0,0,'',0,1,0,0,'abc','abc',
                                        '0', 'abc');|http://www.example.com/|Duplicate entry '8388607' for key 1
我想做的是运行一个正则表达式,只匹配所有的insert查询(忽略时间、url和重复消息)

因此,它应该返回:

INSERT INTO members (id,name,member_login_key,email,mgroup,posts,joined,ip_address,time_offset,view_sigs,email_pm,view_img,view_avs,restrict_post,view_pop,msg_total,new_msg,coppa_user,language,dst_in_use,allow_admin_mails,hide_email,subs_pkg_chosen,members_l_username,members_l_display_name, item_id, members_display_name)
                                    VALUES(8416961,'abc','3857b123a1a67ce1fc4a39fd7ae47355','test@email.com',1,0,1290756788,'127.0.0.1','',1,1,1,1,
                0,1,0,0,0,'',0,1,0,0,'abc','abc',
                                    '0', 'abc');
INSERT INTO members (id,name,member_login_key,email,mgroup,posts,joined,ip_address,time_offset,view_sigs,email_pm,view_img,view_avs,restrict_post,view_pop,msg_total,new_msg,coppa_user,language,dst_in_use,allow_admin_mails,hide_email,subs_pkg_chosen,members_l_username,members_l_display_name, item_id, members_display_name)
                                    VALUES(8416962,'abc','3857b123a1a67ce1fc4a39fd7ae47355','test@email.com',1,0,1290756788,'127.0.0.1','',1,1,1,1,
                0,1,0,0,0,'',0,1,0,0,'abc','abc',
                                    '0', 'abc');

任何人都可以提供帮助?提前谢谢!

您想提取部分内容,还是只是匹配

只是匹配很容易,它根本不需要正则表达式,只需要将子字符串插入

grep 'INSERT INTO' foo.log
如果您想提取详细信息,或有更具体的匹配,请提供更多信息

如果您想拥有以下三行,您可以这样做

grep -A 3 'INSERT INTO' foo.log
如果你想从头到尾删减一些东西(这很难看,但在你的例子中是有用的)


如果所有插入都跨越4行日志文件,则可以使用此regexp:

 (.*)(INSERT INTO.*\n.*\n.*\n.*\))(;.*)
使用此匹配的替换字符串:

 \2\n

这应该是可能的,这在很大程度上取决于整个文件是否与该文件相同

这只是为了获得插入,如果需要日志条目,则需要稍微更改regexp

$logFile = file_get_contents('inserts.log');

$matches = array();
preg_match_all("/(?P<insert>INSERT .+?;)/s", $logFile, $matches);

foreach ($matches['insert'] as $cQuery) {
    echo $cQuery . "\n";
}
$logFile=文件获取内容('inserts.log');
$matches=array();
preg_match_all(“/(?PINSERT.+?;)/s“,$logFile,$matches);
foreach($cQuery匹配['insert']as$cQuery){
echo$cQuery。“\n”;
}

有关此方法的更多信息,请参阅。

所有查询是否都有4行长?您只需查找包含“INSERT”的行并获取接下来的3行就可以更轻松了……meagar,是的,查询有4行长:(一旦您弄清楚如何将每个查询(无其他数据)放到文件中的一行上,下面的几个答案就可以了(与sed或awk一样)-使用*nix命令sort和uniq获得唯一的行。这是可能的,但是有多行,所以这样做只会返回:INSERT INTO members(id、名称、成员登录密钥、电子邮件、管理组、帖子、加入、ip地址、时间偏移、查看签名、电子邮件pm、查看img、查看avs、限制帖子、查看pop、消息总数、新消息、coppa用户、语言、dst使用、允许管理员邮件、隐藏电子邮件、选择的潜艇、成员用户名、成员显示名称、项目id、成员显示名称)如果行数不变(例如,每次3行,如您的示例所示),那么它仍然很简单。我将修改我的答案。嗨,El,我测试了解决方案,但它返回查询+日期+url,重复消息等。因此,您想要所有唯一的记录,忽略时间、url和重复消息?如果每个记录的ID都是唯一的,那么每个插入仍然是唯一的-您也要忽略吗?
$logFile = file_get_contents('inserts.log');

$matches = array();
preg_match_all("/(?P<insert>INSERT .+?;)/s", $logFile, $matches);

foreach ($matches['insert'] as $cQuery) {
    echo $cQuery . "\n";
}