PHP preg_match_all匹配多个模式

时间:2013-05-07 08:15:37

标签: php regex preg-match-all

我有几个带有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);

我不明白为什么这不起作用。我尝试过没有括号的变体,但没有任何效果。此外 - 我的方法是否有任何潜在的问题,我没有看到?

1 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

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

您没有匹配/\*!\*/标记中的反斜杠。我不知道原始正则表达式是如何起作用的,因为它也有这个错误。