我有mysql的信息几个10GB的文件,我想过滤特定表。PHP preg_match_all来匹配多个模式
的查询看起来像这样(虽然可以有更多或更少的换行符):
SET INSERT_ID=2/\*!\*/;
at 858735202
121124 12:36:53 server id 1 end_log_pos 0 Query thread_id=9695754 exec_time=0 error_code=0
SET TIMESTAMP=1663753413/\*!\*/;
INSERT INTO `bank_accounts_daily`
(
`accounts_bank_md5` ,
`accounts_bank_payment_desc` ,
`accounts_bank_amount` ,
`accounts_bank_number` ,
`accounts_bank_sortcode` ,
`accounts_bank_currency` ,
`accounts_bank_date`,
`accounts_bank_code`
)
VALUES
(
'zxcvxzcvxzc4c9eeca78908296a2f007',
'NAMEJO M 1105294 BBP',
'278.50',
'645450441',
'20-55-19',
'1',
'26/55/2012',
'BBP'
)
/\*!\*/
我使用这一点,其工作是检索每一个语句:
preg_match_all('/(SET INSERT_ID=([0-9]+)\/\*\!\*\/\;)(.*?)(\/\*\!\*\/\;)(.*?)(\/\*\!\*\/)/s', $input, $output);
但是,当我试图将其展开,并添加额外的模式,专门匹配“bank_accounts_daily”的格局不会检索任何东西(不管反引号的转义与否):
preg_match_all('/(SET INSERT_ID=([0-9]+)\/\*\!\*\/\;)(.*?)(\/\*\!\*\/\;)(.*?)(INSERT INTO \`bank_accounts_daily\`)(.*?)(\/\*\!\*\/)/s', $input, $output);
我不明白为什么这是行不通的。我尝试过没有括号的变体,但没有任何工作。另外 - 我的方法有没有任何潜在的问题,我没有看到?
您可以在线测试您的模式http://www.functions-online.com/preg_match.html使其更容易发现错误 – Waygood 2013-05-07 08:21:20
感谢@Waygood,伟大的工具 - 我在那里测试过 - 但如果我添加额外的模式仍然不起作用。 – Crackermann 2013-05-07 08:40:08
@Barmar有解决方案BTW这个工作在线/ SET INSERT_ID =([0-9] +)\/\\\\ * \ * \\\\ \ /;!(。*?)(INSERT INTO \'bank_accounts_daily \')(*)\/\\\\ * \ * \\\\ \ //小号 – Waygood 2013-05-07 08:41:38