mi aggiravo se qualcuno bene in PHP potrebbe consigliare su come convalidare le staffe in un pungiglione espressione come questa:Come convalidare le staffe in stringa un'equazione in PHP
(5 * 3 [ 6) - 6]
che è l'espressione sbagliata. Ho bisogno di una funzione per farlo. Ecco cosa ho provato fino ad ora:
<?php
function hasMatchedParenthesis($string) {
$counter1 = 0;
$counter2 = 0;
$length = strlen($string);
for ($i = 0;$i < $length; $i++) {
$char = $string[$i];
if($char == '(') {
$counter1 ++;
} elseif($char == ')') {
$counter1 --;
}
for($j =0;$j < $length; $j++) {
$char = $string[$j];
if($char == '[') {
$counter2 ++;
} elseif($char == ']') {
$counter2 --;
}
}
if($counter1 < 0 || $counter2 < 0) {
return false;
}
}
echo 'ok';;
}
hasMatchedParenthesis('[5] * 3 - (4 - 7 * [3-6])'); // this is ok!
hasMatchedParenthesis('(5 * 3 [ 6) - 6]'); // this returns as TRUE, but it is not!
?>
Le parole mi aiutano a risolvere la convalida della cosa [6]! Non so come farlo :(
Consenti parentesi nidificate? per esempio. '((1 + 3)/(2-5)) + 5' ... se è così, probabilmente meglio utilizzare una corretta lexer –
Credo che la vostra condizione di controllo non è giusto. Dovrebbe essere "if ($ counter1! = 0 || $ counter2! = 0) {return false; } '. Cominci con entrambi i contatori '0' ed entrambi dovrebbero essere' 0' quando hai finito di convalidare se le parentesi sono valide. Questo è in aggiunta al commento di @MarkBaker :-) risposta – Havelock
di ircmaxell per http://stackoverflow.com/questions/12692727/how-to-make-a-calculator-in-php è un buon punto di partenza per una matematica formula lexer (e un parser, se avete bisogno che pure) –