2016-01-23 52 views
0

我試過解析MySQL轉儲來自動創建遷移。正則表達式php重複字符錯誤

DROP DATABASE與解析:

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

但創建表的查詢返回false和空數組:

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語法
  • \ W不處理所有可能le字符爲db /表名稱