>  기사  >  백엔드 개발  >  来问一个有关问题,正则匹配创建数据库SQL的数据库名称

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

WBOY
WBOY원래의
2016-06-13 13:34:19791검색

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



------解决方案--------------------
/create\s+database\s+(\w+)/is

名称有可能没有``,有可能没有空格
无可能
------解决方案--------------------

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

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

------解决方案--------------------
那串符号可以用[:punct:]表示,[:punct:]代表标点符号字符 类似的还有[:alnum:] [:space:] ... 各表示几种类型的字符串
可以修改如下
PHP code
preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);
<br><font color="#e78608">------解决方案--------------------</font><br>
试下<br>
PHP code
$databases = <font color="#e78608">------解决方案--------------------</font><br>上面的不行,``中间的`必须是偶数位。。这个比较麻烦。
<br><font color="#e78608">------解决方案--------------------</font><br>
探讨


没错啊。``中间的`是偶数位能匹配出来就没问题。为单数的话说明是有问题的SQL了,不需考虑。

你上面的`aaa````bbb` 匹配不了哦。

引用:

上面的不行,``中间的`必须是偶数位。。这个比较麻烦。
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.