【发布时间】: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