Chodziłam jeśli ktoś dobry w PHP mógłby doradzić, w jaki sposób sprawdzić poprawność wsporniki w użądleniu ekspresyjnym tak:Jak zweryfikować wsporniki w równaniu ciąg w PHP
(5 * 3 [ 6) - 6]
który jest niewłaściwy wyraz. Potrzebuję do tego funkcji. Oto, co próbowałem do tej pory:
<?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!
?>
Zarzuty pomogły mi rozwiązać problem "[6]"! Nie wiem jak to zrobić :(
Czy zezwalasz na zagnieżdżone nawiasy? na przykład '((1 + 3)/(2 - 5)) + 5' ... jeśli tak, prawdopodobnie najlepiej użyć odpowiedniego lexera. –
Myślę, że twój warunek sprawdzania nie jest właściwy. Powinno to być 'if ($ counter1! = 0 || $ counter2! 0) {return false; } '. Zaczynasz od obu liczników "0", a oba powinny mieć wartość "0" po sprawdzeniu, czy nawiasy są prawidłowe. Jest to dodatek do komentarza @MarkBaker :-) – Havelock
Odpowiedź ircmaxell na http://stackoverflow.com/questions/12692727/how-to-make-a-calculator-inphph jest dobrym punktem wyjścia do matematycznego formuła lexer (i parser, jeśli potrzebujesz tego również) –