2011-04-14 21 views
0

我想下面的SQL查詢轉換:正則表達式轉換MySQL的SQL語法SQLite的兼容語法(易情形)

'UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)' 

成這樣:

'CONSTRAINT `UNIQUE_TAG` UNIQUE (`identifier`,`keyname`)' 

我的問題是,我必須搶到第一關鍵詞作爲一個變種,如:

'<$1> KEY `UNIQUE_TAG` (`identifier`,`keyname`)' 

得到它這裏

'CONSTRAINT `UNIQUE_TAG` <$1> (`identifier`,`keyname`)' 

查看http://www.sqlite.org/lang_createtable.html以查看sqlite兼容SQL的語法。

我想用PHP來做,但我不知道如何完成這件事。

在此先感謝。

+0

我還應該提到sql的部分發生在完整的CREATE TABLE語句中。 – d1rk 2011-04-14 07:22:31

回答

2

您的語法並不遙遠。

這個例子應該有所幫助:

$query = "UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)"; 

$regex = "/\b([^ ]+) KEY ([^ ]+) \(([^)]+)\)/"; 
$substitution = "CONSTRAINT $2 $1 ($3)"; 

$results = preg_replace($regex, $substitution, $query); 

print $results; 

一些解釋:

  • \bmatches一個字邊界
  • [^ ]匹配非空格字符和[^ ]+匹配(字符串或空白的開始)非空格字符一次或多次
  • (...)可以捕獲任何...。這個捕獲組可替換字符串由$1引用(因爲它是第一個捕獲組)
  • [^)]+的非閉括號字符的字符串,它是至少一個字符長

少可讀但更匹配廣義匹配:

$regex = "/\b(\w+)\h+KEY\h+(\H+)\h+\(([^)]+)\)/"; 

進一步說明:

  • \w+匹配一個或多個「字」字符
  • \h+匹配一個或多個水平空白字符(製表符和空格)
  • \H匹配一個或多個非「水平空白」字符(反引號沒有字字符)
+0

謝謝 - 我忘了提及這個陳述只是一個例子。鍵(在這種情況下:標識符,鍵名)和約束名稱(在這種情況下:UNIQUE_TAG)可以隨時變化。 – d1rk 2011-04-14 07:21:49

+0

好的。我已經概括了約束名稱和鍵。 – 2011-04-14 07:30:31

+0

謝謝 - 這工作。 – d1rk 2011-04-14 09:22:31

0

試試這個正則表達式(UNIQUE)?KEY (.+) (\(.+\))CONSTRAINT $2 $1$3

<?php 
$sourcestring="UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)"; 
echo preg_replace('/(UNIQUE)?KEY (.+) (\(.+\))/','CONSTRAINT $2 $1$3',$sourcestring); 
?> 

http://www.myregextester.com/?r=83cd23ec

更換