2010-12-07 2 views
1

Ayant à peu près couvert les bases de PHP, j'ai décidé de me lancer un défi et de faire une simple calculatrice. Après quelques tentatives, j'ai compris, mais je ne suis pas entièrement satisfait. Je veux le rendre plus convivial et avoir la saisie de la calculatrice dans une seule boîte, très semblable à google search.Essayer de diviser une chaîne en 3 variables, mais un peu plus compliqué - PHP

Donc on suffit de taper: 5 + 2 et recevez 7.

Comment puis-je diviser la chaîne « 5 + 2 » en trois variables afin que les fonctions mathématiques peuvent convertir les nombres en entiers et reconnaître la opérateur, ainsi que la prise en compte de la possibilité de quelqu'un utilisant des espaces entre les valeurs aussi bien?

Voulez-vous exploser la chaîne? Mais que feriez-vous exploser s'il n'y a pas d'espaces? Je suis également tombé sur la fonction preg_split, mais je n'arrive pas à comprendre comment il est possible de résoudre ce problème. Quelle méthode serait la meilleure option pour cela?

+0

Juste boucle à travers tous les caractères de la chaîne et de comprendre ce qui est quoi. –

+0

Pour la curiosité, comment allez-vous faire cela dans un exemple? – Why

+0

Que comptez-vous faire exactement avec les données une fois qu'elles ont été séparées?Je suggère de le rendre un peu moins difficile et plus cool (IMO) en créant un calculateur javascript complet avec des boutons afin que tout soit déjà séparé lors de la publication. Il est beaucoup plus difficile de leur donner une zone de texte libre car vous êtes sur la bonne voie pour créer un analyseur mathématique qui peut être très difficile (il peut y avoir des analyseurs existants qui pourraient aider à cela, comme PHPExcel) . – webbiedave

Répondre

2
$calc = "5* 2+ 53"; 
$calc = preg_replace('/(\s*)/','',$calc); 
print_r(preg_split('/([\x28-\x2B\x2D\x2F])/',$calc,-1,PREG_SPLIT_DELIM_CAPTURE)); 

C'est mon offre, ce qui

Array 
(
    [0] => 5 
    [1] => * 
    [2] => 2 
    [3] => + 
    [4] => 53 
) 
+0

Cela l'a vraiment résolu. Merci beaucoup! – Why

0

Vous devrez scinder la chaîne en utilisant des expressions régulières. Par exemple simple regex pour 5 + 2 serait:

\d\+\d 

Vérifiez cette link. Vous pouvez créer et valider vos expressions régulières ici. Pour une calculatrice, ce ne sera pas si difficile.

+0

Grande ressource, merci! Enfin quelque chose qui peut m'aider à donner un sens aux expressions régulières. – Why

+0

Bien que ce soit probablement la meilleure réponse que vous puissiez obtenir, je tiens juste à souligner que PHP n'est pas vraiment construit pour les choses de bas niveau comme ça. Cela étant dit, un calculateur "parfait" (comme dans le "trou de sécurité majeur") pour PHP serait $ result = eval ($ expression) – vassilis

+0

Avec ce que @vassilis a dit, le temps serait mieux passé à faire une regex qui valide les expressions pour expressions mathématiques réelles, puis les transmettre à eval(). –

1

Vous devrez peut-être utiliser une expression régulière intelligent pour diviser quelque chose comme:

$ myOutput = split ("(- [0-9] +) | ([+ - * /] {1}) | (-? [0-9] +) ");

Je n'ai pas testé cela - juste un exemple semi-psuedo-ish désolé: -> juste en essayant de mettre en évidence que vous devrez vous rappeler que votre opérateur - (moins) peut apparaître au début d'un entier pour faire C'est un nombre négatif, donc vous pourriez vous retrouver avec des problèmes avec des choses comme -1--21 qui est valide mais qui complique vos règles regex.

0

Vous avez la bonne idée avec preg_split. Il travaillerait quelque chose comme ceci:

$values = preg_split("/[\s]+/", "76 + 23"); 

Le tableau résultant contiendra des valeurs qui ne sont pas des espaces:

Les valeurs doivent ressembler à ceci: valeurs $ [0]: "76" Valeurs $ [1 ]: "+" $ values ​​[2]: "23"

le "/ [\ s] + /" est un modèle d'expression régulière qui correspond à tout caractère d'espace une ou plusieurs fois. Cependant, s'il n'y a aucun espace, preg_split retournera simplement l'original "5 + 2" comme une seule chaîne dans le premier élément du tableau. i.e. .:

$values[0] = "5+2" 
Questions connexes