我試圖在PHP中創建一個函數,用於評估數學表達式 - 包括諸如sin,cos等函數。我的方法是刪除所有字符不是數字,數學運算符或數學函數,然後在eval()中使用該字符串。問題在於我對正則表達式不夠了解,無法在同一表達式中否定字符和短語。排除列表中的所有字符而不是列表中的短語
到目前爲止,這是我有:
$input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input);
顯然,字符正弦,餘弦,和棕褐色可以按任意順序輸入表達式中使用(而不是隻允許短語sin,cos和tan)。如果我進一步擴展此功能以包含更多的字符和函數,則會帶來更大的安全風險,因爲惡意用戶可以通過與應用程序的巧妙交互來執行任何PHP命令。
誰能告訴我如何解決我的正則表達式並消除這個問題?
嗯,還有一個原因,大多數語言拋出語法錯誤而不是嘗試一個最好的猜測,這樣瘋狂的謊言(你必須要在某些情況下是非常好的猜測)。你的解決方案仍然是一個解析器,而不是正則表達式(實際上,這並不困難),並且不用擔心執行任何PHP命令。 'eval = -evil'(在大多數情況下...) – Wrikken 2010-10-07 17:07:45
http://en.wikipedia.org/wiki/Shunting_yard_algorithm – Wrikken 2010-10-07 17:11:01
謝謝,Wrikken。過去十年我沒有看到這種情況,並且(相當不方便)忘記了這一點。我想我必須編寫一個解析器,而不是試圖用快速解決方案逃脫。 – 2010-10-07 17:21:46