Regex用于从Alter SQL语句中提取表名和字段

时间:2016-07-14 07:14:34

标签: php regex

我有一个很大的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 个答案:

答案 0 :(得分: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);