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

解决方案 »

  1.   

    /create\s+database\s+(\w+)/is名称有可能没有``,有可能没有空格
    无可能
      

  2.   

    唠叨哥,这个就匹配不了了。
    CREATE DATABASE  `aaab` 
    名称有可能没有``,这样就没有`
    CREATE DATABASE  aaab
    有可能没有空格,这样就没有空格
    CREATE DATABASE`aaab`
    还有得考虑这样的特殊情况,
    CREATE DATABASE`aaa@@@#b`
    头有点大,正则不是很熟练……
      

  3.   

    还有可能这样子CREATE DATABASE`aaa``b`
      

  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);
      

  5.   

    你没有考虑这样子,这个用s*就没问题
    CREATE DATABASE    aaab还有后面可能有些关键字
    CREATE DATABASE aaab  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci最后还有这一条……
    CREATE DATABASE`aaa``b`
    应该是匹配出来 aaa``b 的,这个才是真正名称 :D .......
      

  6.   

    <?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]);好吧  你接着提需求,帮你改到满意为止
      

  7.   

    厉害…… 其实名称不只是可以@#这两个符号,上面只是举例,
    其它符号应该都可以的,CREATE DATABASE`()` 这样也可以创建一个名为()的数据库的。只要用上``就没问题,唯一``中可以有`的情况 就要 `aaa``bbb` 这样子用两个``代表一个`
      

  8.   

    就是说只要用上`` 名字里可以有任何符。没用上`的话 名字只能用字母与数字,而且前面要加个空格与DATABASE文字分隔开。
      

  9.   

    不用判断啊。我只考虑正确执行SQL情况,没符合规则也就SQL报错了,不需匹配了。你上面写的是可以的~~preg_match_all('/CREATE\s+DATABASE\s*((`?)([\w\~\!@#\$\%\^\&\*\(\)\_\+\|\}\{\"\:\?\>\<\/\.\,\'\;\]\[=-\`]+)\2\s?)/is',$sql,$matchs);
    我把所有符号加上了,目前没发现有什么问题,就是这样看上去很笨拙哈,如果能用上^什么排除的方法会好些
    。还有请教你下你用\2是什么意思喂?没这么用过 : ) .....
      

  10.   

    那串符号可以用[:punct:]表示,[:punct:]代表标点符号字符  类似的还有[:alnum:] [:space:] ...  各表示几种类型的字符串
    可以修改如下
    preg_match_all('/CREATE\s+DATABASE\s*((([`\'"])?)([\w[:punct:]]+)\2\s?)/is',$sql,$matchs);
    \1 \2 \3这种形式表示反向引用,\1表示引用前面第一个匹配到的单元,在这里\2表示引用前面第二个匹配到的内容也就是(`?),使用它是为了保证同时出现 两个 `   或者同时不出现
      

  11.   

    试下
    $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); 
      

  12.   

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

  13.   

    这个还算好处理  
    (?:`(?=[^`]*``(?=[^`]+))(.*)`) #`引住带双`的
    那个+改成*即可,问题是
    如果碰到`a``c`b`,中间有单个`出现的就比较难办。
      

  14.   

    你这个感觉没什么问题了啊…… 像这个`a``c`b` SQL不是会报错了么? 错误的SQL就不在考虑范围了。