2010-12-16 3 views
0

КодPHP: SQL вывода проблема регулярных выражений

<?php 
$sql = file_get_contents('source.sql'); 
$regex = '/CREATE TABLE IF NOT EXISTS|INSERT INTO|ALTER TABLE `[0-9a-zA-Z-_]+`/'; 
$matches = array(); 
preg_match_all($regex, $sql, $matches); 
print_r($matches); 
?> 

SQL

CREATE TABLE IF NOT EXISTS `adminnotification_inbox` (
    `notification_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `severity` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `date_added` datetime NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `description` text, 
    `url` varchar(255) NOT NULL, 
    `is_read` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `is_remove` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`notification_id`), 
    KEY `IDX_SEVERITY` (`severity`), 
    KEY `IDX_IS_READ` (`is_read`), 
    KEY `IDX_IS_REMOVE` (`is_remove`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

CREATE TABLE IF NOT EXISTS `admin_assert` (
    `assert_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `assert_type` varchar(20) NOT NULL DEFAULT '', 
    `assert_data` text, 
    PRIMARY KEY (`assert_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ACL Asserts' AUTO_INCREMENT=1; 

CREATE TABLE IF NOT EXISTS `admin_role` (
    `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(10) unsigned NOT NULL DEFAULT '0', 
    `tree_level` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `sort_order` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `role_type` char(1) NOT NULL DEFAULT '0', 
    `user_id` int(11) unsigned NOT NULL DEFAULT '0', 
    `role_name` varchar(50) NOT NULL DEFAULT '', 
    PRIMARY KEY (`role_id`), 
    KEY `parent_id` (`parent_id`,`sort_order`), 
    KEY `tree_level` (`tree_level`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ACL Roles' AUTO_INCREMENT=4; 

INSERT INTO `admin_role` (`role_id`, `parent_id`, `tree_level`, `sort_order`, `role_type`, `user_id`, `role_name`) VALUES 
(1, 0, 1, 1, 'G', 0, 'Administrators'), 
(3, 1, 2, 0, 'U', 1, 'Template'); 

Я пытаюсь понять, почему выше код не показывает имена таблиц в объемах производства, просто вставить и создать заявления. ..

Выход

Array ([0] => Array ([0] => CREATE TABLE IF NOT EXISTS [1] => Crea TE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ [2] => СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ [3] => INSERT INTO) [1] => Массив ([0] => [1] => [2] => [3] =>))

ответ

1

Это потому, что часть [0-9a-zA-Z-_]+ находится только в третьей части вашего «или» (и у вас нет никаких заявлений ALTER TABLE). Использовать

'/(?:CREATE TABLE IF NOT EXISTS|INSERT INTO|ALTER TABLE) `[0-9a-zA-Z-_]+`/' 
+0

К сожалению, я не понимаю .... я пытался понять, но ... Спасибо – foomatic 2010-12-16 11:47:49

1

Как сказал Спинной, совпадение имени таблицы является частью третьего или раздела. Для того, чтобы разделить его можно использовать:

$regex = '/(CREATE TABLE IF NOT EXISTS|INSERT INTO|ALTER TABLE) (`[0-9a-zA-Z-_]+`)/'; 
Смежные вопросы