来问一个问题,正则匹配创建数据库SQL的数据库名称? 要考虑所有情况,只要能创建数据库的SQL的名称都要匹配出来哦。名称有可能没有``,有可能没有空格,有可能没有修饰关键字等... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /create\s+database\s+(\w+)/is名称有可能没有``,有可能没有空格无可能 唠叨哥,这个就匹配不了了。CREATE DATABASE `aaab` 名称有可能没有``,这样就没有`CREATE DATABASE aaab有可能没有空格,这样就没有空格CREATE DATABASE`aaab`还有得考虑这样的特殊情况,CREATE DATABASE`aaa@@@#b`头有点大,正则不是很熟练…… 还有可能这样子CREATE DATABASE`aaa``b` <?php$sql=<<<SQLCREATE DATABASE `aaab`'CREATE DATABASE aaabCREATE DATABASE`aaab`CREATE DATABASE`aaa@@@#b`CREATE DATABASE`aaa``b`SQL;preg_match_all('/CREATE\s+DATABASE\s?((`?)[\w@#]+\2)+/is',$sql,$matchs);print_r($matchs); 你没有考虑这样子,这个用s*就没问题CREATE DATABASE aaab还有后面可能有些关键字CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci最后还有这一条……CREATE DATABASE`aaa``b`应该是匹配出来 aaa``b 的,这个才是真正名称 :D ....... <?php$sql=<<<SQLCREATE DATABASE `aaab`'CREATE DATABASE aaabCREATE DATABASE`aaab`CREATE DATABASE`aaa@@@#b`CREATE DATABASE`aaa``b`CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ciSQL;preg_match_all('/CREATE\s+DATABASE\s*(([`\'"]?)([\w@#`]+)\2\s?)/is',$sql,$matchs);print_r($matchs[3]);好吧 你接着提需求,帮你改到满意为止 厉害…… 其实名称不只是可以@#这两个符号,上面只是举例,其它符号应该都可以的,CREATE DATABASE`()` 这样也可以创建一个名为()的数据库的。只要用上``就没问题,唯一``中可以有`的情况 就要 `aaa``bbb` 这样子用两个``代表一个` 就是说只要用上`` 名字里可以有任何符。没用上`的话 名字只能用字母与数字,而且前面要加个空格与DATABASE文字分隔开。 不用判断啊。我只考虑正确执行SQL情况,没符合规则也就SQL报错了,不需匹配了。你上面写的是可以的~~preg_match_all('/CREATE\s+DATABASE\s*((`?)([\w\~\!@#\$\%\^\&\*\(\)\_\+\|\}\{\"\:\?\>\<\/\.\,\'\;\]\[=-\`]+)\2\s?)/is',$sql,$matchs);我把所有符号加上了,目前没发现有什么问题,就是这样看上去很笨拙哈,如果能用上^什么排除的方法会好些。还有请教你下你用\2是什么意思喂?没这么用过 : ) ..... 那串符号可以用[:punct:]表示,[:punct:]代表标点符号字符 类似的还有[:alnum:] [:space:] ... 各表示几种类型的字符串可以修改如下preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);\1 \2 \3这种形式表示反向引用,\1表示引用前面第一个匹配到的单元,在这里\2表示引用前面第二个匹配到的内容也就是(`?),使用它是为了保证同时出现 两个 ` 或者同时不出现 试下$databases = <<<dbCREATE DATABASE `aaab`CREATE DATABASE aaabCREATE DATABASE `aaab`CREATE DATABASE `aaa@@@#b`CREATE DATABASE `aaa2``b`` `CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLAT……db;preg_match_all( '~create\s+database\s+ ( (?:`(?=[^`]*``(?=[^`]+))(.*)`) #`引住带双`的 | (?:`([^`]+)`) #`引住不带`的 | (?:([a-z0-9]+)) #不带`的 ) ~xis',$databases,$m);print_r($m); 没错啊。``中间的`是偶数位能匹配出来就没问题。为单数的话说明是有问题的SQL了,不需考虑。你上面的`aaa````bbb` 匹配不了哦。 这个还算好处理 (?:`(?=[^`]*``(?=[^`]+))(.*)`) #`引住带双`的那个+改成*即可,问题是如果碰到`a``c`b`,中间有单个`出现的就比较难办。 你这个感觉没什么问题了啊…… 像这个`a``c`b` SQL不是会报错了么? 错误的SQL就不在考虑范围了。 php验证session 报错了 PHP高级群45067352限高手老鸟进 数据库内遇到相同的数据,就覆盖,代码如何实现,用什么函数 求高手指点excel另存为csv文件之后, csv文件怎么用php导入sqlserver 怎样打印php返回内容? 请问怎么通过php查看服务器的CPU和内存占用 我执行向数据库插入一条记录的语句,却总是得到两个相同的记录 请教关于LOCATE或POSITION函数的问题, 这个程序到底错在哪里??? 谁知道这种图片分页显示是如何实现的? 关于Zend加速器 还是重新发帖说一下手册上“关于引用”的问题
无可能
CREATE DATABASE `aaab`
名称有可能没有``,这样就没有`
CREATE DATABASE aaab
有可能没有空格,这样就没有空格
CREATE DATABASE`aaab`
还有得考虑这样的特殊情况,
CREATE DATABASE`aaa@@@#b`
头有点大,正则不是很熟练……
$sql=<<<SQL
CREATE DATABASE `aaab`'
CREATE DATABASE aaab
CREATE DATABASE`aaab`
CREATE DATABASE`aaa@@@#b`
CREATE DATABASE`aaa``b`
SQL;preg_match_all('/CREATE\s+DATABASE\s?((`?)[\w@#]+\2)+/is',$sql,$matchs);
print_r($matchs);
CREATE DATABASE aaab还有后面可能有些关键字
CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci最后还有这一条……
CREATE DATABASE`aaa``b`
应该是匹配出来 aaa``b 的,这个才是真正名称 :D .......
$sql=<<<SQL
CREATE DATABASE `aaab`'
CREATE DATABASE aaab
CREATE DATABASE`aaab`
CREATE DATABASE`aaa@@@#b`
CREATE DATABASE`aaa``b`
CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
SQL;preg_match_all('/CREATE\s+DATABASE\s*(([`\'"]?)([\w@#`]+)\2\s?)/is',$sql,$matchs);
print_r($matchs[3]);好吧 你接着提需求,帮你改到满意为止
其它符号应该都可以的,CREATE DATABASE`()` 这样也可以创建一个名为()的数据库的。只要用上``就没问题,唯一``中可以有`的情况 就要 `aaa``bbb` 这样子用两个``代表一个`
我把所有符号加上了,目前没发现有什么问题,就是这样看上去很笨拙哈,如果能用上^什么排除的方法会好些
。还有请教你下你用\2是什么意思喂?没这么用过 : ) .....
可以修改如下
preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);
\1 \2 \3这种形式表示反向引用,\1表示引用前面第一个匹配到的单元,在这里\2表示引用前面第二个匹配到的内容也就是(`?),使用它是为了保证同时出现 两个 ` 或者同时不出现
$databases = <<<db
CREATE DATABASE `aaab`
CREATE DATABASE aaab
CREATE DATABASE `aaab`
CREATE DATABASE `aaa@@@#b`
CREATE DATABASE `aaa2``b`` `
CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLAT……
db;preg_match_all(
'~create\s+database\s+
(
(?:`(?=[^`]*``(?=[^`]+))(.*)`) #`引住带双`的
|
(?:`([^`]+)`) #`引住不带`的
|
(?:([a-z0-9]+)) #不带`的
)
~xis',$databases,$m);print_r($m);
(?:`(?=[^`]*``(?=[^`]+))(.*)`) #`引住带双`的
那个+改成*即可,问题是
如果碰到`a``c`b`,中间有单个`出现的就比较难办。