首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

来问一个有关问题,正则匹配创建数据库SQL的数据库名称

2012-04-27 
来问一个问题,正则匹配创建数据库SQL的数据库名称?要考虑所有情况,只要能创建数据库的SQL的名称都要匹配出

来问一个问题,正则匹配创建数据库SQL的数据库名称?
要考虑所有情况,只要能创建数据库的SQL的名称都要匹配出来哦。
名称有可能没有``,有可能没有空格,有可能没有修饰关键字等...



[解决办法]
/create\s+database\s+(\w+)/is

名称有可能没有``,有可能没有空格
无可能
[解决办法]

PHP code
<?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);
[解决办法]
PHP code
<?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]);
[解决办法]
名称里面可以出现什么符号 往中括号里面加就行了 比如你说的() [\w@#`()]
我只能保证数据库名两边同时出现 ` 或者同时不出现 `,不能控制里面 ` 的数量
[解决办法]
探讨
就是说只要用上`` 名字里可以有任何符。

没用上`的话 名字只能用字母与数字,而且前面要加个空格与DATABASE文字分隔开。

[解决办法]
那串符号可以用[:punct:]表示,[:punct:]代表标点符号字符 类似的还有[:alnum:] [:space:] ... 各表示几种类型的字符串
可以修改如下
PHP code
preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);
[解决办法]
试下
PHP code
$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` 匹配不了哦。

引用:

上面的不行,``中间的`必须是偶数位。。这个比较麻烦。

热点排行