2008-11-29 57 views
7

我需要在某些PHP頁面上評估用戶定義的任意複雜度的邏輯表達式。假設表單域是主要變量,它將需要:PHP中的動態邏輯表達式解析/評估?

  • 替換「varibles」表單 字段值;
  • 手柄比較運算符, 微創==,<,< =,> =和>通過 符號,名稱(例如當量,LT,LE,GE,分別GT );
  • 處理布爾操作符不,和,或和 可能通過名稱,符號XOR(例如, & &,||和^^分別!);
  • 處理字符串 和數字的文字值;
  • 是明文未XML(如「名字 ==‘’或姓氏==‘’);以及
  • 合理高性能

現在年來我走了已經寫遞歸下降解析器。這可能會建立一個表達式樹並做這種事情,但那不是我在PHP中所享受的任務,所以我希望有些事情能夠讓我至少能夠在那裏獲得一些方式。 ?

+2

我能問,你有沒有管理創建簡單的表達,而不使用eval解析功能? – buggedcom 2011-11-15 21:19:02

回答

3

支票create_function,它通過傳遞的字符串參數創建一個匿名函數,我不確定它的性能,但它非常靈活...

+0

Ooooo不錯。我不是PHP專家,所以我不知道create_function。感謝那。 – cletus 2008-11-29 05:40:00

+1

在這裏值得一提的是,已棄用PHP 7.2.0 – 2017-08-13 17:50:41

1

如果我正確地理解了這個問題,您希望用戶寫出非函數-PHP,然後讓PHP解釋它?

如果是這樣,你可以簡單地把它們的字符串替換爲「<」和「gt」替換爲「>」,然後執行eval()。我有一個預感,問題不是這麼簡單,但如果是這樣,eval()可以完成這項工作。當然,那麼你打開自己的任何形式的攻擊。

+0

謝謝你的答案。其實答案可能很簡單。我不是PHP專家。 Java更適合我。這些表達都不是來自外部世界。它的所有內部配置。 – cletus 2008-11-29 05:39:26

0

看看my infix to postfix example我認爲你可以將它移植到PHP相對容易。它只使用一個數組和一些開關。沒有樹。只有運行後綴結果才需要堆棧。

0

你可以試着將我的計算器類(https://github.com/djfm/Evaluator),它的算術表達式(現在),你可以使用的變量太多。所有主要的PHP運營商都已實施。

5

自從問了這個問題以來,時間已經過去了,而且我偶然正在爲php尋找一個表達式解析器。我選擇使用Symfony 2.4中的ExpressionLanguage組件。它可以通過packagist與作曲家無關地安裝。

composer require symfony/expression-language