2016-07-14 1 views
-1

У меня есть большая строка SQL, например:Regex для извлечения имени таблицы и поля из заявления Alter 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

Смежные вопросы