首页 / 帖子
麻烦帮忙 把 preg_replace的/e修饰符 用preg_replace_callback改写

  private function escapeAnsi($query)

  {

 

  if (preg_match("/^select /i",$query)&&!preg_match("/^select(.*)from/ims",$query))

   $query.= ' FROM DUAL';


     $search = array ('/("\w+?")/e',

                      "/([^\s\(]+) & ([^\s]+) = ([^\s\)]+)/",

                      "/([^\s\(]+) & ([^\s]+) <> ([^\s\)]+)/", // bitand

                      '/^RELEASE SAVEPOINT (.*)$/');


     $replace = array ("strtoupper('\\1')",

                       "BITAND(\\1,\\2) = \\3",

                       "BITAND(\\1,\\2) <> \\3",

                       "begin null; end;");


     return str_replace('\\"','"',preg_replace($search, $replace, $query));  

   

  }




 private function escapeReserved($query)

  {

        $ddl= !((boolean)preg_match('/^(select|insert|update|delete)/i',$query));

        $search = array ("/({)(\w+)(})/e", // escapes all table names

                         "/({L#)([0-9]+)(})/e", // escapes long id

                "/(\:)(uid|session|file|access|mode|comment|desc|size|start|end)/e",

          "/(<uid>|<session>|<file>|<access>|<mode>|<comment>|<desc>|<size>".($ddl?'':'|<date>').")/e",

          '/([\(\.\s,\=])(uid|session|file|access|mode|comment|desc|size'.($ddl?'':'|date').')([,\s\=)])/e',

                         '/([\(\.\s,])(uid|session|file|access|mode|comment|desc|size'.($ddl?'':'|date').')$/e');


   $replace = array ("'\"\\1'.strtoupper('\\2').'\\3\"'",

         "'\"\\1'.strtoupper('\\2').'\\3\"'",

         "'\\1'.'db_'.'\\2'.'\\3'",

     "strtoupper('\"\\1\"')",

     "'\\1'.strtoupper('\"\\2\"').'\\3'",

                     "'\\1'.strtoupper('\"\\2\"')");


        return preg_replace($search, $replace, $query);  

  }




一共这两个函数。将return 用 preg_replace_callback 改写 。是drupal7里面的oracle驱动模块。



我开始直接删除 /e   或者直接return $query。 都会报不同的错误。

不改的话,php又过不了。

若吧php改成5.4 。oracle驱动又不认识。

0个答案