我有一个很大的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);
提前致谢。
答案 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);