@
klzhoushuai 分两步。
1 用正则取出 &&或者|| 符号中间的内容。
2 利用字符串替换多余的括号。
PHP 写法如下:
```
// 两个字符串例子
$str1 = 'a1=1&&a2=2&&a3=3&&(a4=1||a5=2||(a6=3&&a7=4))';
$str2 = 'a1==1 && a2==3 && ((a4a5+(a6+a7)/3)>10 || (a1 /((a2/100)(a2/100))) >= 28 || (a3*((a1)+(a4-a5)+(a2))>4) ) && a10==6 || a9==9 && (a3>4 || a5 <6)';
preg_match_all('/[^&|^\|]+/', $str1, $match);//提取 &&或者||符号中间的内容。
if (!empty($match[0])) {
foreach ($match[0] as &$value) {
$value = trim(removeBrackets($value));//移除多余的括号
}
}
var_dump($match);
/**
* 移除多余的括号
* @
param $string
* @
return string|string[]|null
*/
function removeBrackets($string)
{
// 左括号 右括号 默认 0 个
$leftBracket = $rightBracket = 0;
// 计算括号个数
for($i=0;$i<strlen($string);$i++){
if ($string[$i] == '(') {
$leftBracket++;
} elseif ($string[$i] == ')') {
$rightBracket++;
}
}
$abs = abs($leftBracket - $rightBracket);//括号个数的差值
if ($abs == 0) {
return $string;
}
if ($leftBracket > $rightBracket) {// 如果 左括号多,移除多余的
$string = preg_replace('/\(/', '', $string, $abs);
} elseif ($leftBracket < $rightBracket) {// 如果 右括号多,移除多余的
$string = preg_replace('/\)/', '', $string, $abs);
}
return $string;
}
```
两个例子转换结果如下:
```
[
"a1=1",
"a2=2",
"a3=3",
"a4=1",
"a5=2",
"a6=3",
"a7=4"
]
第二个和你期待的有一点点不一样,但是我觉得应该也符合你预期。
[
"a1==1",
"a2==3",
"(a4a5+(a6+a7)/3)>10",
"(a1 /((a2/100)(a2/100))) >= 28",
"(a3*((a1+(a4-a5)+(a2))>4) )",
"a10==6",
"a9==9",
"a3>4",
"a5 <6"
]
```