编写PHP函数解析字符串

<?php
/**
 * str = (A*1+(B*2-E*6)*3)*2+C*3-D*8
 */

function resolve($str, $start=0, & $result=array()){
    $array = array();
    $k=0;
    for($i=$start; $i<strlen($str); $i++){
        if($str[$i] == '('){//每次碰到小括号,产生一个child
            $k++;
            $ret = resolve($str, $i+1, $result);//递归获取child
            $i=$ret['i'];//跳过已经处理的字符
            //取当前数组后面的乘数
            $s = substr($str,$i+1);
            $m = preg_split('/[\+\)]/', $s);
            //对返回的child进行遍历乘以乘数
            foreach($ret['array'] as $v){
                if(strlen($v) > 2){
                    $math = '';
                    if(strstr($v, '-') !== false){
                        $math = '-';
                        $v = preg_replace('/[\+\-]/', '', $v);
                    }
                    $a = explode('*', $v);
                    eval("\$result[\$a[0]] = $math"."$a[1]"."$m[0];");
                    $array[$k] = $a[0].'*'.$result[$a[0]];
                    $k++;
                }
            }
        }elseif($str[$i] == ')'){
            //遇到)则返回当前的child和当前的$i
            return array('array'=>$array, 'i'=>$i);
        }else{
            //字符串按+分割成子字符串,并对子字符串进行分割处理
            if($str[$i] == '+' || strlen($str)-1 == $i){
                if(strpos($array[$k], '*')){
                    $math = '';
                    if(strstr($array[$k], '-') !== false){
                        $math = '-';
                        $array[$k] = str_replace('-', '', $array[$k]);
                    }
                    $array[$k] = str_replace('+', '', $array[$k]);
                    $a = explode('*', $array[$k]);
                    if(strlen($str)-1 == $i)
                        $a[1] .= $str[$i];
                    $result[$a[0]] = $math.$a[1];
                }
                $k++;
            }
            if(isset($array[$k]))
                $array[$k] .= $str[$i];
            else
                $array[$k] = $str[$i];
        }
    }
    return $result;
}
$str2 = '(A*1+(B*2-E*6)*3)*2+C*3-D*8';
//替换所有为+-,因为减一个数等于加一个负数
$str2 = str_replace('-', '+-', $str2);
print_r(resolve($str2));
//end

转载请注明:小Y » 编写PHP函数解析字符串

赞 (0) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址