【问题标题】:PHP preg_match_all to match multiple patternsPHP preg_match_all 匹配多个模式
【发布时间】:2013-05-01 03:04:56
【问题描述】:

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

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

【问题讨论】:

  • 您可以在线测试您的模式functions-online.com/preg_match.html 更容易发现错误
  • 谢谢@Waygood,很棒的工具 - 我在那里测试过 - 但如果我添加额外的模式,它仍然不起作用。
  • @Barmar 有解决方案顺便说一句,这个在线工作 /SET INSERT_ID=([0-9]+)\/\\\*\!\\\*\/;(.*?)(插入`bank_accounts_daily`)(.*?)\/\\\*\!\\\*\//s
  • @Waygood - 非常感谢 :)
  • @Waygood - 好吧 - 它似乎可以在那个网站上工作,但不能在我的本地系统上工作。我应该问一个新问题吗?

标签: php regex preg-match-all


【解决方案1】:

试试这个正则表达式:

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

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

【讨论】:

  • 谢谢@Barmar,我的测试数据有错误。标记应该看起来像 /*!*/ (抱歉)。这个答案确实适用于http://functions-online.com/preg_match.html 上的给定数据——它的细微变化也适用于正确的数据——但是它不适用于具有真实数据的本地系统。它只返回一个空数组(尽管我原来问题中的前一个答案确实有效)。我的系统可能有问题吗?是时候提出新问题了?
  • 如果你更正问题中的测试数据,我也许可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2014-06-28
  • 2014-04-08
  • 2015-03-14
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多