来问一个问题,正则匹配创建数据库SQL的数据库名称?
要考虑所有情况,只要能创建数据库的SQL的名称都要匹配出来哦。
名称有可能没有``,有可能没有空格,有可能没有修饰关键字等...
[解决办法]
/create\s+database\s+(\w+)/is
名称有可能没有``,有可能没有空格
无可能
[解决办法]
<?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$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@#`()]
我只能保证数据库名两边同时出现 ` 或者同时不出现 `,不能控制里面 ` 的数量
[解决办法]
preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);
[解决办法]
试下
$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);
[解决办法]
上面的不行,``中间的`必须是偶数位。。这个比较麻烦。
[解决办法]