2011-06-19 199 views
2

我想从SQL'CREATE'查询中获取列名。字符串匹配

查询:

CREATE TABLE 'test' (
'col1' INT(10) NOT NULL , 
'col2' VARCHAR(50) NOT NULL , 
'col3' DATE NOT NULL 
) ENGINE = MYISAM ; 

代码:

preg_match_all("/'(.+)' (\w+)\(? ?(\d*) ?\)?/", $sql, $_matches, PREG_SET_ORDER); 

输出:

Array ( 
[0] => Array ([0] => 'col1\' INT(10) [1] => col1\ [2] => INT [3] => 10) 
[1] => Array ([0] => 'col2\' VARCHAR(50) [1] => col2\ [2] => VARCHAR [3] => 50) 
[2] => Array ([0] => 'col3\' DATE [1] => col3\ [2] => DATE [3] =>) 
) 

但我需要简单的结果如T他的:

array(
    array('INT(10)', 'col1'), 
    array('VARCHAR(50)', 'col2'), 
    array('DATE', 'col3') 
); 

每种可能的解决方案将不胜感激。由于

+0

-ve票,同时也欢迎.. – Awan

+0

相关答案:如何获取列'MySQL Create Table'Query string?](http://stackoverflow.com/questions/5590928/how-to-fetch-column-names-from-mysql-create-table-query-string/5591342#5591342) – hakre

+0

看起来像一个机智的问题h'addslashes()'或'magic_quotes'(在'preg_match_all'之前) – knittl

回答

2
$sql = <<<SQL 
     CREATE TABLE 'test' (
     'col1' INT(10) NOT NULL , 
     'col2' VARCHAR(50) NOT NULL , 
     'col3' DATE NOT NULL 
     ) ENGINE = MYISAM ; 
SQL; 

preg_match_all("/'(.+)' (\w+(?:\(?\d* ?\))?)/", $sql, $matches, PREG_SET_ORDER); 

$matches = array_map(function($array) { 
    return array($array[2], $array[1]); 
}, $matches); 

var_dump($matches); 

输出

array(3) { 
    [0]=> 
    array(2) { 
    [0]=> 
    string(9) "INT(10)" 
    [1]=> 
    string(4) "col1" 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    string(13) "VARCHAR(50)" 
    [1]=> 
    string(4) "col2" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(4) "DATE" 
    [1]=> 
    string(4) "col3" 
    } 
} 
2

重新使用现有的查询从以前的答案:

preg_match_all("/'(.+)' ((\w+)\(? ?(\d*) ?\)?)/", $sql, $_matches, PREG_SET_ORDER); 

$matches = array_map(function($v) {return array(trim($v[2]), $v[1]);}, $_matches);