2013-05-07 98 views
3

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

我不明白为什么这是行不通的。我尝试过没有括号的变体,但没有任何工作。另外 - 我的方法有没有任何潜在的问题,我没有看到?

+0

您可以在线测试您的模式http://www.functions-online.com/preg_match.html使其更容易发现错误 – Waygood 2013-05-07 08:21:20

+0

感谢@Waygood,伟大的工具 - 我在那里测试过 - 但如果我添加额外的模式仍然不起作用。 – Crackermann 2013-05-07 08:40:08

+0

@Barmar有解决方案BTW这个工作在线/ SET INSERT_ID =([0-9] +)\/\\\\ * \ * \\\\ \ /;!(。*?)(INSERT INTO \'bank_accounts_daily \')(*)\/\\\\ * \ * \\\\ \ //小号 – Waygood 2013-05-07 08:41:38

回答

2

试试这个正则表达式:

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

你是不匹配的/\*!\*/标记反斜线。我不明白原始正则表达式可以如何工作,因为它也有这个错误。

+0

谢谢@Barmar,我的测试数据出现错误。标记应该看起来像**/*!*/**(对不起)。这个答案没有对给定的数据上工作[http://functions-online.com/preg_match.html](http://functions-online.com/preg_match.html) - 一样就可以了轻微的变化,以适应正确的数据 - 但它不能在我的本地系统上使用真实数据。它只是返回一个空数组(尽管我原来的问题中的前一个答案确实有效)。我的系统中可能会有什么?是时候提出新的问题了? – Crackermann 2013-05-07 09:47:03

+0

如果您更正了问题中的测试数据,我可能会提供帮助。 – Barmar 2013-05-07 10:05:01