时间:2021-07-01 10:21:17 帮助过:4人阅读
- <!--?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><dl class="code">PHP code<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><!--?php</li><li>$sql=<<<SQL</li><li>CREATE DATABASE `aaab`'</li><li>CREATE DATABASE aaab</li><li>CREATE DATABASE`aaab`</li><li>CREATE DATABASE`aaa@@@#b`</li><li>CREATE DATABASE`aaa``b`</li><li>CREATE DATABASE aaab DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci</li><li>SQL;</li><li>preg_match_all('/CREATE\s+DATABASE\s*(([`\'"]?)([\w@#`]+)\2\s?)/is',$sql,$matchs);</li><li>print_r($matchs[3]);</li><li><br /--><font color="#e78608">------解决方案--------------------</font><br>名称里面可以出现什么符号 往中括号里面加就行了 比如你说的() [\w@#`()]<br>我只能保证数据库名两边同时出现 ` 或者同时不出现 `,不能控制里面 ` 的数量</li><li><br><font color="#e78608">------解决方案--------------------</font><br><fieldset><legend>探讨</legend><br>就是说只要用上`` 名字里可以有任何符。<br><br>没用上`的话 名字只能用字母与数字,而且前面要加个空格与DATABASE文字分隔开。<br></fieldset></li><li><br><font color="#e78608">------解决方案--------------------</font><br>那串符号可以用[:punct:]表示,[:punct:]代表标点符号字符 类似的还有[:alnum:] [:space:] ... 各表示几种类型的字符串<br>可以修改如下<br><dl class="code">PHP code<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li>preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);</li><li><br><font color="#e78608">------解决方案--------------------</font><br></li><li>试下<br><dl class="code">PHP code<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li>$databases = <<<db create="" database="" `aaab`="" aaab="" `aaa@@@#b`="" `aaa2``b``="" `="" default="" character="" set="" utf8="" collat……="" db;="" preg_match_all(="" '~create\s+database\s+="" (="" (?:`(?="[^`]*``(?=[^`]+))(.*)`)" #`引住带双`的="" |="" (?:`([^`]+)`)="" #`引住不带`的="" (?:([a-z0-9]+))="" #不带`的="" )="" ~xis',$databases,$m);="" print_r($m);="" <br=""><font color="#e78608">------解决方案--------------------</font><br>上面的不行,``中间的`必须是偶数位。。这个比较麻烦。</li><li><br><font color="#e78608">------解决方案--------------------</font><br><fieldset><legend>探讨</legend><br><br><br>没错啊。``中间的`是偶数位能匹配出来就没问题。为单数的话说明是有问题的SQL了,不需考虑。<br><br>你上面的`aaa````bbb` 匹配不了哦。<br><br>引用:<br><br>上面的不行,``中间的`必须是偶数位。。这个比较麻烦。<br></fieldset> </db></li></ol></pre></dl></li></ol></pre></dl></li></ol></pre></dl>