PHP preg_match_all для соответствия нескольким шаблонам

У меня есть несколько файлов размером 10 ГБ с информацией о mysql, которую я хотел бы отфильтровать для конкретной таблицы.

Запросы выглядят следующим образом (хотя могут иметь меньше или больше разрывов строк):

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

Я не понимаю, почему это не работает. Я пробовал варианты без скобок, но ничего не работает. Кроме того, есть ли какие-либо потенциальные проблемы с моим подходом, которых я не вижу?


person Crackermann    schedule 07.05.2013    source источник
comment
Вы можете протестировать свои шаблоны онлайн на functions-online.com/preg_match.html, чтобы упростить задачу. замечать ошибки   -  person Waygood    schedule 07.05.2013
comment
Спасибо @Waygood, отличный инструмент - я там тестировал - но если я добавлю дополнительный шаблон, он все равно не сработает.   -  person Crackermann    schedule 07.05.2013
comment
У @Barmar есть решение, кстати, это работало онлайн /SET INSERT_ID=([0-9]+)\/\\\*\!\\\*\/;(.*?)(INSERT INTO `bank_accounts_daily`)(. *?)\/\\\*\!\\\*\//s   -  person Waygood    schedule 07.05.2013
comment
@Waygood - понял, большое спасибо :)   -  person Crackermann    schedule 07.05.2013
comment
@Waygood - ну - кажется, это работает на этом сайте, но не в моей локальной системе ... мне задать новый вопрос?   -  person Crackermann    schedule 07.05.2013


Ответы (1)


Попробуйте это регулярное выражение:

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

Вы не сопоставили обратную косую черту в маркерах /\*!\*/. Я не понимаю, как могло бы работать исходное регулярное выражение, поскольку оно также содержало эту ошибку.

person Barmar    schedule 07.05.2013
comment
Спасибо @Barmar, в моих тестовых данных произошла ошибка. Маркеры должны выглядеть как /*!*/ (извините за это). Этот ответ работает с данными на http://functions-online.com/preg_match.html - как и небольшая вариация, чтобы соответствовать правильным данным - однако это не работает в моей локальной системе с реальными данными. Он просто возвращает пустой массив (хотя предыдущий ответ в моем исходном вопросе работает). Может ли быть что-то в моей системе? Время для нового вопроса? - person Crackermann; 07.05.2013
comment
Если вы исправите тестовые данные в вопросе, я смогу помочь. - person Barmar; 07.05.2013