2010-08-18 70 views
2

在我的工作對遺留代碼庫,有一個條件評價其接受用戶輸入,以建立一個條件。然後使用php eval()在運行時評估這個條件。不使用eval解決此問題的最佳方法是什麼?替代關於「的eval()uating」的條件

例如,我在用戶界面中輸入了條件「1> 0」。這必須進行評估並返回結果(在本例中爲true)。有什麼建議麼?

我們知道,如果這個問題似乎含糊其辭,我會試着更好的解釋。

+0

你可以創建自己的標記生成器,或啓動PHP內置的一個,如果你的條件語法是足夠相似:http://php.net/token-get-all – janmoesen 2010-08-18 11:42:48

回答

2

的上PHPClasses evalMath parser過提供用於評估這種類型表達的安全框架。

+0

+1。我會嘗試一下..任何想法如果我將PHP函數傳遞給解析器會發生什麼? – pinaki 2010-08-18 11:40:45

+0

如果你特別需要的PHP函數(如字符串操作或其他),而不是簡單的數學函數,那麼它很容易把這些東西加到內置的功能列表 – 2010-08-18 11:42:04

+0

偉大的..好像它會做......會試試看並看到它可以導致...感謝您的快速回復.. – pinaki 2010-08-18 11:45:53

1

我想說的模式最適合這將是Specification pattern

在計算機編程中,規範模式是一種特定的軟件設計模式,可以通過使用布爾邏輯將業務邏輯鏈接在一起來重組業務邏輯。

但是,這種方法會要求您爲用戶給出的輸入編寫解析器,以便將條件安全地轉換爲規範實例。根據所允許條件的複雜程度,這可能不是一件容易的事。

您可以通過爲斷言創建帶有create_function的lambda函數來實現此目的,但這與用戶輸入時使用eval一樣不安全。

+0

+1似乎很有趣,不確定我是否可以使用它,因爲這可能需要重大更改...感謝無論如何的答案,我會追求它,並看到它導致.. – pinaki 2010-08-18 11:44:55