嵌套的语法结构不能单纯用正则表达式分析
为避免产生歧义,大多数据库在实现sql时都要求自查询用“()”括起,并对各子句的出现顺序有严格要求你需要先将源文转换成2型文法表述后再使用正则表达式

解决方案 »

  1.   

    <?php
    $sql="SELECT [t2.col1] FROM 
      [(SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2]
    WHERE [t2.col1 = 1 AND t2.col2 IN 
       SELECT t1.col1 FROM t1 WHERE t1.col1 = 1)]
    GROUP BY [t2.col1]
    ORDER BY [t2.col1]";preg_match_all("/\[[^\]]*\]/", $sql, $arr1);
    preg_match_all("/\[([^\]]*)\]/", $sql, $arr2);echo "<pre>";
    print_r($arr1);
    print_r($arr2);
    echo "</pre>";
    ?>
      

  2.   

    <?php
    $sql="SELECT [t2.col1] FROM 
      [(SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2]
    WHERE [t2.col1 = 1 AND t2.col2 IN 
       SELECT t1.col1 FROM t1 WHERE t1.col1 = 1)]
    GROUP BY [t2.col1]
    ORDER BY [t2.col1]";preg_match_all("/\[[^\]]*\]/", $sql, $arr1);
    preg_match_all("/\[([^\]]*)\]/", $sql, $arr2);echo "<pre>";
    print_r($arr1);
    print_r($arr2);
    echo implode(" ", $arr1[0]);
    echo "\n";
    echo implode(" ", $arr2[1]);
    echo "</pre>";
    ?>
      

  3.   

    to  zhiin() ouk.cn () 
    SELECT [t2.col1] FROM 
      [(SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2]
    WHERE [t2.col1 = 1 AND t2.col2 IN 
       SELECT t1.col1 FROM t1 WHERE t1.col1 = 1)]
    GROUP BY [t2.col1]
    ORDER BY [t2.col1]
    是合法的sql语句吗?正确的应该是:
    SELECT t2.col1 FROM 
      (SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2
    WHERE t2.col1 = 1 AND t2.col2 IN 
       (SELECT t1.col1 FROM t1 WHERE t1.col1 = 1)
    GROUP BY t2.col1
    ORDER BY t2.col1楼主加上“[]”只是为了便于说明需求
      

  4.   

    呵呵,zhiin() ouk.cn要认真阿,呵呵,做作业题一样的去做可不行啊。:)
      

  5.   

    给你一个测试例供参考。要知道,事情远没有这么简单!
    <?php
    $sql =<<< SQL
    SELECT t2.col1 
    FROM (SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2
    WHERE t2.col1 = 1 AND t2.col2 IN 
       (SELECT t1.col1 FROM t1 WHERE t1.col1 = 1)
    GROUP BY t2.col1
    ORDER BY t2.col1
    SQL;function fifo($v='') {
      static $st = array();
      if($v == '' || $v[1] == '_ST_')
        return array_shift($st);
      else {
        array_push($st,$v[0]);
        return '_ST_'.count($st).'_';
      }
    }$sql = preg_replace_callback("/\(.+\)/U","fifo",$sql);
    preg_match_all("/(select)(.+)(from)(.+)(where)(.+)(group by)(.+)(order by)(.+)/is",$sql,$regs);for($i=1;$i<count($regs);$i+=2)
      echo "{$regs[$i][0]}:".preg_replace_callback("/(_ST_)\d+_/","fifo",$regs[$i+1][0]).'<br>';
    ?>
    SELECT: t2.col1 
    FROM: (SELECT col1, col2 FROM t1 WHERE 1 = 1 ORDER BY col1) t2 
    WHERE: t2.col1 = 1 AND t2.col2 IN (SELECT t1.col1 FROM t1 WHERE t1.col1 = 1) 
    GROUP BY: t2.col1 
    ORDER BY: t2.col1