2008-11-29 24 views
7

मुझे कुछ PHP पृष्ठों पर मनमानी जटिलता के उपयोगकर्ता द्वारा परिभाषित तार्किक अभिव्यक्तियों का मूल्यांकन करने की आवश्यकता है।PHP में गतिशील तार्किक अभिव्यक्ति पार्सिंग/मूल्यांकन?

  • स्थानापन्न रूप क्षेत्रों मूल्यों के लिए "varibles";: प्राथमिक चर यह मानते हुए कि प्रपत्र फ़ील्ड्स रहे हैं, यह करने की आवश्यकता होगी
  • संभाल तुलना ऑपरेटरों, न्यूनतम ==, <, < =,> = और> द्वारा प्रतीक, नाम (उदाहरण के लिए eq, लेफ्टिनेंट, ले, जीई, जीटी क्रमशः);
  • बूलियन ऑपरेटरों (!, जैसे & &, || और ^^ क्रमशः) या और संभवतः नाम, प्रतीक से XOR संभाल नहीं, और,;
  • स्ट्रिंग्स और संख्याओं के लिए शाब्दिक मानों को संभाल लें;
  • प्लेन ( == '' या उपनाम == '' उदाहरण के लिए "firstname) नहीं एक्सएमएल, और
  • यथोचित performant हो
अब

साल मैं बीते में पुनरावर्ती डिसेंट पारसर्स लिखा है। जो एक अभिव्यक्ति वृक्ष बना सकता है और इस तरह की चीज कर सकता है, लेकिन यह एक ऐसा काम नहीं है जिसे मैं PHP में जोड़ रहा हूं, इसलिए मुझे आशा है कि वहां कुछ चीजें हैं जो कम से कम मुझे वहां से कुछ रास्ते मिल जाएंगी।

सुझाव

+2

मैं पूछ सकता हूँ, आप सरल eval का उपयोग किए बिना पार्स करने अभिव्यक्ति के लिए एक समारोह बनाने के लिए प्रबंधन कैसे किया? – buggedcom

उत्तर

3

देखें, यह पारित स्ट्रिंग पैरामीटर से एक अनाम फ़ंक्शन बनाता है, मुझे इसके प्रदर्शन के बारे में निश्चित नहीं है, लेकिन यह बहुत लचीला है ...

+0

ओउ अच्छा है। मैं कोई PHP विशेषज्ञ नहीं हूं इसलिए मुझे create_function के बारे में पता नहीं था। उसके लिए धन्यवाद। – cletus

+1

यहां ध्यान दें कि PHP 7.2.0 –

1

यदि मैं सही ढंग से समस्या को समझता हूं, तो आप चाहते हैं कि उपयोगकर्ता गैर- -पीएचपी, और उसके बाद PHP व्याख्या है?

यदि ऐसा है, तो आप बस अपनी स्ट्रिंग ले सकते हैं और "<" और "gt" के साथ "gt" को प्रतिस्थापित कर सकते हैं ... फिर eval() करें।

मुझे लगता है कि समस्या यह आसान नहीं है, लेकिन यदि यह है, eval() नौकरी कर सकता है। बेशक, तो आप किसी भी तरह के हमले के लिए खुद को खोल रहे हैं।

+0

के रूप में बहिष्कृत किया गया है, उत्तर के लिए धन्यवाद। जवाब वास्तव में इतना आसान हो सकता है। मैं कोई PHP विशेषज्ञ नहीं हूँ। जावा मेरा अधिक schtick है। इनमें से कोई भी अभिव्यक्ति बाहरी दुनिया से नहीं आ रही है। इसकी सभी आंतरिक विन्यास। – cletus

+0

'eval' के साथ समस्या यह है कि यह मनमाने ढंग से PHP कोड निष्पादित करता है जो इसे पारित किया जाता है। परंपरागत रूप से इंजेक्शन हमलों के साथ एक मुद्दा रहा है। यानी उपयोगकर्ता कोड में पास हो सकते हैं जो उत्पादन कोड के रूप में उसी वातावरण में प्लग इन और निष्पादित किया जाएगा। उपयोगकर्ता की चतुरता या दुर्भावना के आधार पर, वह कोड विनाशकारी और अवांछित साइड इफेक्ट्स का कारण बन सकता है। आपको अपने चेकर/प्रतिलिपि में मनमाने ढंग से PHP – Dennis

0

my infix to postfix example पर एक नज़र डालें, मुझे लगता है कि आप इसे आसानी से PHP के साथ पोर्ट कर सकते हैं। यह केवल एक सरणी और कुछ स्विच का उपयोग करता है। कोई पेड़ नहीं एक स्टैक केवल पोस्टफिक्स परिणाम चलाने के लिए आवश्यक है। इस समारोह बाहर

0

तुम मेरे मूल्यांकनकर्ता वर्ग (https://github.com/djfm/Evaluator) अनुकूल कोशिश कर सकते हैं, यह गणित भाव (अब के लिए) करता है और आप चर भी उपयोग कर सकते हैं। सभी प्रमुख PHP ऑपरेटर लागू किए गए हैं।

5

इस सवाल के बाद से काफी समय बीत चुका है, और मैं php के लिए एक अभिव्यक्ति पार्सर की तलाश में हुआ। मैंने सिम्फनी 2.4 से ExpressionLanguage घटक का उपयोग करना चुना। इसे packagist के माध्यम से संगीतकार से कोई निर्भरता के साथ स्थापित किया जा सकता है।

composer require symfony/expression-language

+1

के भीतर सभी संभावित मुद्दों को फ़िल्टर करने में सक्षम होने के लिए बहुत सावधान और चालाक होना होगा। मैंने स्टैक ओवरफ्लो और Google पर यहां वर्णित लगभग सभी अभिव्यक्तियों का मूल्यांकन किया। मैं इस का उपयोग कर समाप्त हो गया। – larrydahooster

संबंधित मुद्दे