2010-11-09 9 views
0

Je ne m'appellerais pas un maître en ce qui concerne regex, je connais à peu près les bases. J'ai joué avec, mais je n'arrive pas à obtenir le résultat souhaité. Donc, si quelqu'un m'aiderait, je l'apprécierais vraiment! J'essaie de vérifier si des mots indésirables existent dans une chaîne. Je travaille sur un projet mathématique, et je vais utiliser eval() pour calculer la chaîne, donc je dois m'assurer que c'est sûr.PHP - Aide avec regex?

La chaîne peut contenir (juste par exemple maintenant, je vais ajouter plus de fonctions plus tard) les mots suivants: (lire les commentaires)

floor() // spaces or numbers are allowed between the() chars. If possible, i'd also like to allow other math functions inside, so it'd look like: floor(floor(8)*1). 
It may contain any digit, any math sign (+ - * /) and dots/commas (,.) anywhere in the string 

Pour être clair, voici un autre exemple: Si une chaîne comme celui-ci est passé, je ne suis pas veulent que ça passe:

9*9 + include('somefile')/floor(2) // Just a random example on something that's not allowed 

maintenant que je pense à ce sujet, il semble un peu compliqué. J'espère que vous pouvez au moins me donner quelques indices.

Merci à l'avance, -Anthony

Edit: Ceci est un peu hors sujet, mais si vous connaissez une meilleure façon de calculer les fonctions mathématiques, s'il vous plaît suggérer. J'ai cherché une classe/fonction de maths sûre qui calcule une chaîne d'entrée, mais je n'en ai pas encore trouvé.

Répondre

1

Veuillez ne pas utiliser eval() pour cela.

Ma réponse standard à cette question chaque fois qu'il affleure:

Ne pas utiliser eval (surtout si la formule contient l'entrée d'utilisateur) ou réinventer la roue en écrivant votre propre analyseur de formule. Jetez un oeil à la classe evalMath sur les PHPClasses.

Il devrait faire tout ce que vous voulez dans un joli bac à sable sécurisé.

+0

Je vais jeter un oeil à cette classe, merci! Mais pourquoi ne devrais-je pas utiliser eval dans ce cas? Si je le filtre pour les mauvais caractères/mots, et refuse l'accès s'il ne passe pas - comment pourraient-ils percer? – Anthony

+0

Le problème avec eval dans ce cas est que vous ne pouvez pas filtrer toutes les possibilités. –

+0

Eh bien, presque? Je veux dire, si autre chose que les caractères/mots autorisés sont entrés, l'eval ne sera pas déclenché. Je ne vois pas comment quelque chose de "mauvais" pourrait être entré, et si l'utilisateur entre seulement des caractères/mots valides, rien ne devrait aller mal? Je suis juste curieux, c'est intéressant et bon à savoir. J'ai téléchargé evalMath et cela fonctionne merveilleusement, merci pour le conseil. Même si la fonction eval fonctionne, cela semble plus sûr - après tout, c'est ce que je cherchais en première place. – Anthony

0

Pour reformuler votre problème, vous ne souhaitez autoriser qu'un ensemble spécifique de caractères, plus certains mots prédéfinis. L'opérateur alternance (symbole de la conduite) est votre ami dans ce cas:

([0-9\+\-\*\/\.\,\(\) ]|floor|ceiling|other|functions)* 

Bien sûr, en utilisant eval est intrinsèquement dangereux, et il est difficile de garantir que cette regex offrira une protection complète dans une langue avec une syntaxe aussi vaste comme PHP.

+0

Considérez-vous une regex comme ce coffre-fort? Ou devrais-je essayer une autre méthode? Merci pour l'aide.:) – Anthony

+0

Non, je n'utiliserais eval comme ça pour un usage personnel, et je n'aurais pas besoin de l'expression rationnelle. Je me pencherais sur evalMath, selon la recommandation de Mark. – deemer

+0

Très bien, je vais donner un coup de feu. Merci! – Anthony