2016-01-23 3 views
0

Я пробовал разбор MySQL дампа для автоматического создания миграций.Ошибка повторения символа регулярного выражения

отбрасывания базы данных анализируется с:

preg_match_all('/DROP TABLE.+`.+`(.+|.?);/', $this->contents, $this->dropTableBlock); 

Но создать таблицы запроса возвращают ложные и пустой массив:

preg_match_all('/CREATE TABLE.+`.+`.+\(.+\).+(ENGINE=.+)?.+(DEFAULT CHARSET=[.]{1,5});/is', $this->contents, $this->createTableBlock); 

На regex101.com, что совпадает нужны строки: https://regex101.com/r/eD8wI5/1

Скажи пожалуйста, почему preg_match_all ничего не находит?

+0

Вы можете еще больше повысить производительность [например, в regex101] (https://regex101.com/r/pD0xL0/1) (также для соответствия движку). –

+1

Это не работа для регулярного выражения. Вы должны использовать синтаксический анализатор SQL, например, этот: https://github.com/greenlion/PHP-SQL-Parser –

+0

Не является '(. + |.?)' Таким же, как '(. *)' Но даже это не имеет смысла. –

ответ

0

Извлечение [] вокруг точки исправить.

preg_match_all('/CREATE TABLE.+`.+`.+\(.+\).+(ENGINE=.+)?.+(DEFAULT CHARSET=.{1,5});/is', $content, $matches); 
+0

Но да, я согласен с другими комментариями. Вы не должны использовать это для миграции баз данных. Для этого есть специальные инструменты. – JesusTheHun

0
\s*DROP\s+DATABASE\s+((`.+`|\w+)\.)(`.+`|\w+)\s+; 

Примечание

  • Ручка ведущего/ведомых пробела
  • Лакомство новых строка и таблицы как пробельная
  • ручки дополнительного backtics
  • обрабатывает dbname.tablename синтаксис
  • \ ш не обрабатывать все возможности le characters для имен db/table
Смежные вопросы