2016-07-14 8 views
-1

私は例えば、大きなSQL文字列を持っている:正規表現

... 
-- sales_address 
ALTER TABLE sales_address 
    ADD COLUMN `cod_fee` decimal(12,4) DEFAULT NULL, 
    ADD COLUMN `base_cod_fee` decimal(12,4) DEFAULT NULL; 

-- sales_item 
ALTER TABLE sales_item 
    ADD COLUMN `is_free` tinyint(4) NOT NULL DEFAULT '0'; 

-- sales_payment 
ALTER TABLE sales_payment 
    ADD COLUMN `payment_no` varchar(255) NOT NULL, 
    ADD COLUMN `payment_sid` varchar(255) NOT NULL, 
    ADD COLUMN `payment_trx` varchar(255) NOT NULL; 
... 

例えば、配列としてテーブル名や列を抽出したい:

$finalOutput = array(
    'sales_address' => array(
     'cod_fee', 
     'base_cod_fee' 
    ), 

    'sales_item' => array(
     'is_free' 
    ), 

    'sales_payment' => array(
     'payment_no', 
     'payment_sid', 
     'payment_trx' 
    ) 
); 

preg_match_allなどのネストを行う必要があるかもしれません。事前に

preg_match_all('/what-regex-goes-here/', $SQL, $matches); 

ありがとう: は、これまでのところ、私は正規表現としてを使用しようとしました。

答えて

1
<?php 
$sql = " 
-- sales_address 
ALTER TABLE sales_address 
    ADD COLUMN `cod_fee` decimal(12,4) DEFAULT NULL, 
    ADD COLUMN `base_cod_fee` decimal(12,4) DEFAULT NULL; 

-- sales_item 
ALTER TABLE sales_item 
    ADD COLUMN `is_free` tinyint(4) NOT NULL DEFAULT '0'; 

-- sales_payment 
ALTER TABLE sales_payment 
    ADD COLUMN `payment_no` varchar(255) NOT NULL, 
    ADD COLUMN `payment_sid` varchar(255) NOT NULL, 
    ADD COLUMN `payment_trx` varchar(255) NOT NULL; 
..."; 

// separate tables 
$tables = preg_split("/\n\n/", $sql); 

$result = array(); 
foreach($tables as $table) 
{ 
     // get table name 
     preg_match("/ALTER TABLE ([^\s]+)\n/", $table, $table_name); 
     $result[$table_name[1]] = array(); 

     // get all columns 
     preg_match_all("/ADD COLUMN `[^\s]+`/", $table, $columns); 
     foreach($columns[0] as $column) 
     { 
       preg_match("/ADD COLUMN `([^\s]+)`/", $column, $c); 
       $result[$table_name[1]][] = $c[1]; 
     } 
} 

print_r($result); 
+1

素晴らしい!魅力的な作品! – MagePsycho