这样的递归怎么做?!select a,(select b from c where ...) as d,efrom f,(select j from h where ...) as iwhere ....登录后复制我要把外层select ... from ...中,select后面的内容替换掉,而保留from后面的内容。最后变成:select count(*)from f,(select j from h where ...) as iwhere ....登录后复制其实这相当于xml/html节点的替换,类似递归问题,想了很久也没想到解决方法。------解决方案--------------------正则....不行如果你只是想得到返回的行数, 你总是可以这样做:select count(*) from (-- 你的sql --select a,(select b from c where ...) as d,efrom f,(select j from h where ...) as iwhere ....) tmp如果你非要严格做替换, 要做语法分析, 考虑到单双引号, 括号等等....------解决方案--------------------不知道你是要写SQL指令,还是要做字符串替换如果是做字符串替换,可以这么写$s = select a,(select b from c where ...) as d,efrom f,(select j from h where ...) as iwhere ....TXT;$ar = preg_split('/(\(?\bselect\b------解决方案--------------------\bfrom\b)/i', $s, -1, PREG_SPLIT_NO_EMPTY ------解决方案-------------------- PREG_SPLIT_DELIM_CAPTURE);$n = 0;$st = array();for($i=0; $i $t = strtolower($ar[$i]); if($t == 'select' ------解决方案-------------------- $t == '(select') { $st[] = $i; } if($t == 'from') { if(count($st) == 1) break; array_pop($st); }}for($i--; $i>$st[0]+1; $i--) unset($ar[$i]);$ar[$st[0]+1] = " count(*)\n";echo join('', $ar);登录后复制select count(*)from f,(select j from h where ...) as iwhere ....
09-15 17:40