PHP preg_match_all用于匹配多个模式

3

我有几个包含mysql信息的10GB文件,我想要筛选出其中特定表格的内容。

查询语句看起来像这样(尽管可能有更少或更多的换行):

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
谢谢@Waygood,很棒的工具 - 我测试过了 - 但是如果我添加额外的模式仍然不起作用。 - Crackermann
@Barmar有解决方案,顺便说一句,这个在线运行正常。/SET INSERT_ID=([0-9]+)/\\!\\/;(.?)(INSERT INTO `bank_accounts_daily`)(.?)/\\!\\//s - Waygood
@Waygood - 嗯 - 它似乎在那个网站上可以工作,但在我的本地系统上不行.. 我应该提一个新问题吗? - Crackermann
1个回答

2

尝试使用这个正则表达式:

/(SET INSERT_ID=([0-9]+)\/\\\*\!\\\*\/\;)(.*?)(\/\\\*\!\\\*\/\;)(.*?)(INSERT INTO `bank_accounts_daily`)(.*?)(\/\\\*\!\\\*\/)/s

你没有在/\*!\*/标记中匹配反斜杠。我不明白原始正则表达式怎么能工作,因为它也有这个错误。


谢谢@Barmar,我的测试数据有误。标记应该看起来像** /!\ **(对此感到抱歉)。这个答案确实适用于http://functions-online.com/preg_match.html上的给定数据 - 以及稍微变化一下以适应正确的数据 - 但是它在我的本地系统上与真实数据不起作用。它只返回一个空数组(尽管我原来问题中的前一个答案有效)。可能是我的系统出了什么问题?是时候提一个新问题了吗? - Crackermann
如果您更正了问题中的测试数据,我可能能够提供帮助。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接