- 普通 - 未处理
public function parseCondition($condition) {
$condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
$condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
case 'array': // 识别为数组
$condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
break;
case 'obj': // 识别为对象
$condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1->\\2 ',$condition);
break;
default: // 自动判断数组或对象 只支持二维
$condition = preg_replace('/\$(\w+)\.(\w+)\s/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition);
}
return $condition;
}
造成的Bug是条件语句只匹配空格前面的语段,但是不匹配结束前面的语段,造成"$aa.bb eq $bb.aa"只解析成"$aa['bb'] == $bb.aa"。可以改成: public function parseCondition($condition) {
$condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
$condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
if (strpos($condition,'.')){
switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
case 'array': // 识别为数组
$condition = preg_replace('/\$(\w+)\.(\w+)/is','$\\1["\\2"] ',$condition);
break;
case 'obj': // 识别为对象
$condition = preg_replace('/\$(\w+)\.(\w+)/is','$\\1->\\2 ',$condition);
break;
default: // 自动判断数组或对象 只支持二维
$condition = preg_replace('/\$(\w+)\.(\w+)/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition);
}
}
return $condition;
}