我的表达式=>({2606}或{2549}或{2543}或({2605}和{2562}(({2408}和{2593}(
我想要这样的输出。
[
"AND" => [
"OR" => [ 2606, 2549, 2543, "AND" => [ 2605, 2562 ] ],
"OR" => [ 2387, 2383, 1990, 2412, 2411, 2409, "AND" => [ 2408, 2593 ] ]
]
]
需要一个php脚本。
$rule = "({2606} OR {2549} OR {2543} OR ({2605} AND {2562})) AND ({2387} OR {2383} OR {1990} OR {2412} OR {2411} OR {2409} OR ({2408} AND {2593}))";
$previous_rule = '';
// Clean Curly Braces and Trim is there's a space.
$rule = trim( str_replace( array( "{", "}" ) , "", $rule ) );
echo "INPUT: " . $rule . "<br><br>";
foreach( range('a', 'z') as $letter ){
$substituted_part = "(". substitution( $rule ) . ")";
$$letter = $substituted_part;
$rule = str_replace( $substituted_part, $letter, $rule );
if( $previous_rule != $rule )
$previous_rule = $rule;
else
break;
}
echo "<PRE>";
print_r( replaceOriginal($rule) );
function replaceOriginal( $rule ){
if( preg_match("/[a-z]/i", $rule) ){
if( strpos( $rule, "AND" ) !== false )
$processed_rule = array( "AND" => explode(" AND ", $rule ) );
else if( strpos( $rule, "OR" ) !== false )
$processed_rule = array( "OR" => explode(" OR ", $rule ) );
foreach( $processed_rule as $operator => $values ){
$processed_rule[$operator] = process( $values );
}
return $processed_rule;
}
}
function process( $values ){
foreach( $values as $key => $value ){
if( !empty( $GLOBALS[$value] ) ){
$substituted_value = str_replace( array( "(", ")" ) , "", $GLOBALS[$value] );
$values[$key] = replaceOriginal( $substituted_value );;
}
}
return $values;
}
function substitution( $rule ){
// Get anything thats wrapped in parentheses.
if( preg_match_all('#((([^()]+|(?R))*))#', $rule, $matches) ){
foreach( $matches[1] as $value ){
return substitution( $value );
}
}else{
return $rule;
}
}