PHP:SQL输出正则表达式问题

PHP:SQL输出正则表达式问题,php,sql,regex,preg-match-all,Php,Sql,Regex,Preg Match All,代码 我试图理解为什么上面的代码没有在输出中显示表名,只是插入和创建语句 输出 数组([0]=>Array([0]=>CREATE TABLE IF NOT EXISTS[1]=>CREATE TABLE IF NOT EXISTS[2]=>CREATE TABLE IF NOT EXISTS[3]=>INSERT in)[1]=>Array([0]=>[1]=>[2]=>[3]=>)这是因为[0-9a-zA-Z-部分仅在“或”的第三部分(并且您没有任何altertable语句) 正如Spiny

代码

我试图理解为什么上面的代码没有在输出中显示表名,只是插入和创建语句

输出


数组([0]=>Array([0]=>CREATE TABLE IF NOT EXISTS[1]=>CREATE TABLE IF NOT EXISTS[2]=>CREATE TABLE IF NOT EXISTS[3]=>INSERT in)[1]=>Array([0]=>[1]=>[2]=>[3]=>)

这是因为
[0-9a-zA-Z-
部分仅在“或”的第三部分(并且您没有任何
altertable
语句)


正如Spiny所说,表名匹配是第三部分或第三部分的一部分。要将其拆分,可以使用:

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

您尝试匹配
创建表(如果不存在)
插入到
更改表
的所有实例,最后是表名regexp。但是,匹配引擎不知道您希望表名regexp与这三种可能性中的每一种匹配,除非您放入
()
围绕第一部分。让我这样说:您当前的regexp是这样解释的:
(如果不存在,则创建表)|(插入到)|(更改表“[0-9a-zA-Z-”+”)
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');
'/(?:CREATE TABLE IF NOT EXISTS|INSERT INTO|ALTER TABLE) `[0-9a-zA-Z-_]+`/'
$regex = '/(CREATE TABLE IF NOT EXISTS|INSERT INTO|ALTER TABLE) (`[0-9a-zA-Z-_]+`)/';