Ariciao Tony, non sapevo che fare e ti ho ordinato il codice con una input ed una funzione javascript che accetta solo numeri e operatori + - * / , però si può fare si meglio, ti spiego, se tu togli la funzione javascript e il ereg_replace dal PHP e scrivi sin(2) dentro la input il parse calcola tranquillamente, adesso qual'è il punto, che bisogna passare alla input una stringa che abbia un'annotazione matematica che il php riconosce...Tu puoi gestire tutti i casi, ovviamente bisogna programmarla, se vai qui vedi quali sono ad esempio le formule che il php accetta che poi sono quelle matematiche di base, tipo asin sin cos tan atan sinh abs sqrt pow etc...
http://php.net/manual/it/ref.math.php
Comunque con l'esempio sotto che ho un pochino ordinato hai una input di inserimento espressione che accetta numeri e operatori e parentesi premi calcola e quella calcola tranquillamente...se per esempio scrivi nella input *2**5** ovviamente ti dice espressione non valida devi scrivere 2*5...anche se scrivi **5 ti dice espressione non valida....Si può fare tranquillamente senza complicarsi la vita ma usando le potenzialità del PHP...Ciao
Ps:Copia ed incolla il codice sotto in una pagina con estensione .php
Codice PHP:
<html>
<form action="" method="post">
<div style="text-align: center">
<label for="espresisone">Inserisci la tua espressione</label>
<input type="text" value="" id="espressione" onkeypress="return numbers(event)" name="espressione"/><br><br>
<input type="submit" value="Calcola">
</div>
</form>
</html>
<script type="text/javascript">
function numbers(e) {
var keynum;
var keychar;
var numcheck;
if (window.event){// IE
keynum = e.keyCode;
} else if (e.which){// Netscape/Firefox/Opera
keynum = e.which;
}
//alert(' keynum ' + keynum);
if ((keynum == 8) || (keynum == 9)) {
return true;
}
//operatori + - * / e parentesi e freccia di cancellazione
if ((keynum == 40) || (keynum == 41) ||
(keynum == 42) || (keynum == 43) ||
(keynum == 45) || (keynum == 47) ||
(keynum == 46) ){
return true;
}
keychar = String.fromCharCode(keynum);
numcheck = /\d/;
return numcheck.test(keychar);
}
</script>
<?php
error_reporting(E_ERROR);
if (isset($_POST['espressione'])){
$string = $_POST['espressione'];
if (trim($string)==''){
print "<div style='text-align: center'>";
print 'Inserire l\'equazione';
print "</div>";
exit;
}
function calculate_string( $mathString ) {
$mathString = trim($mathString); // trim white spaces
$mathString = ereg_replace ('[^0-9\+-\*\/\(\) ]', '', $mathString);//remove any non-numbers chars; exception for math operators
$compute = create_function("", "return (" . $mathString . ");" );
if ($compute==false){
print "<div style='text-align: center'>";
print 'Equazione non valida';
print "</div>";
exit;
}
else{
return $compute();
}
}
print "<div style='text-align: center'>";
echo "Risultato : <span style='color:red;font-weight: bold' >" .calculate_string($string) ."</span><br>";
print "</div>";
}
?>
Cioè tu puoi tranquillamente eliminare l'onkeypress e commentare la riga di ereg_replace nel php, poi nella input se tu fai una prova e scrivi 2+3*(1+sin(2)) ti da come risultato 7.727892280477....Che è quello giusto ma se tu scrivi adfsin(2) ti da un fatal error ovviamente perchè adfsin(2) non è una funzione riconosciuta...Le funzioni riconosciute sono quelle del link che ti ho messo sopra.
Quindi hai due possibilità o fai la input come ti ho messo sopra quindi che accetta solo numeri e operatori e non hai nessun problema oppure commenti la riga di ereg_replace e togli l'onkeypress e metti error_reporting(0) ed avverti l'utente di cosa deve scrivere dentro la input quali funzione matematiche accetta...Lo avverti che se vuole calcolare il seno o il coseno dovrà scrivere sin() cos() etc...così diventa anche un input scientifica.... :) È un trick perfetto usare la create_function perchè il PHP fa tutto da solo basta solamente farsi ritornare la stringa valida e la create_function in quel modo fa proprio quello.
Un altro esempio l'elevazione a potenza si usa POW adesso se tu elimini keypress e ereg_replace e scrivi
pow( (1+2)*2 , 2)
non è altro che ((1+2)*2)^2 = 36
Ed infatti se provi e fai calcola ti da 36...Quindi potresti anche permettere l'elevatore così ^ però devi gestire poi nel php che se ttrova ^ è un pow...quindi poi gli devi passare i giusti valori cioè qual'è la base e qual'è l'elevatore ma infatti nelle calcolatrici se vedi per l'elevazione a potenza non c'è il taso con ^ ma c'è x^y di solito è una funzione a parte come lo sqrt cioè la radice quadrata...Devi gestire dal php.