日期:2014-05-17  浏览次数:20481 次

求熟悉正则的给个判断方法
我写了个函数
autoConv( $string , $a=array() )
{
  eval('$res='.$string.';');
  return($res);
}
功能就是根据字符串所组成的表达式自动计算,其中$array的作用比较特殊,是字符串表达式中可能含有数组元素。

比如:
autoConv( 'a[1]+a[2]-a[3]' , array(0,10,20,30) )

返回结果 10+20-30 = 0

啰嗦了这么多,希望各位看明白了,这里有个问题需要判断,就是传递过来的字符串表达式是否有未被赋值的元素。

比如:
autoConv( 'a[1]+a[2]-a[3]+a[4]' , array(0,10,20,30) )
其中没有a[4]的值

其实这个函数是处理数据库中读取的数据,并根据第一个参数字符串表达式来计算,如果遇到没有赋值的情况,只要单独读取一下数据库

由于整个系统设计的原因,有时候不可避免要出现默认传递的数组没有包含字符串表达式所需的所有数组元素的情况,这时候需要先判断出是哪个值没有,然后单独去读数据库,而这个判断我无法写出,感谢各位帮忙~!
比如
'(a[1]+a[2])/2 * a[3] - a[4]'这样的字符串表达式,有a[1] a[2] a[3] a[4] 这样4个参数,如何判断出来,感谢感谢!!




------解决方案--------------------
如果有嵌套,分析挺难的

这样行不行

ob_start();
eval("……");
$res = ob_get_contents();
ob_clean();

判断$res里有没有报错信息
------解决方案--------------------
是这个意思吧?
PHP code

function autoConv( $string , $a=array() ) {
  preg_match_all('/\[(\d+)\]/', $string, $r);
  $t = array_diff($r[1], array_keys($a));
  if($t) return '缺少数据项: ' . join(',', $t);
  $string = str_replace('a', '$a', $string);
  eval('$res='.$string.';');
  return($res);
}

------解决方案--------------------
PHP code


//板门弄斧头一下

function auto()
{
    $arg=func_get_args();
    preg_match_all("/(%d)/i",$arg[0],$rs);
    $parttern=$arg[0];
    array_shift($arg);
    $arglist=join(",",$arg); 
    eval("\$string=sprintf('$parttern',$arglist);");
    eval("echo $string;");
     
}
 
  auto("%d*%d*%d-%d",1,2,9,4);
  auto("%d*%d*%d-%d",10,2,9,4);