<?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
/**
* 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函数解析字符串