व्यक्तिगत रूप से, मुझे लगता है कि कोड अभी भी बहुत बुरा है क्योंकि आप टिप्पणी नहीं कर रहे हैं कि यह क्या कर रहा है। यह वैधता के लिए इसके इनपुट का परीक्षण भी नहीं कर रहा है, जिससे यह बहुत नाजुक हो गया है।
मुझे यह भी लगता है कि, निष्कासन के उपयोग का 95% (या अधिक) सक्रिय रूप से खतरनाक है, छोटे संभावित समय की बचत जो इसे अन्य मामलों में प्रदान कर सकती है, इसका उपयोग करने के बुरे अभ्यास में लिप्त होने के लायक नहीं है। साथ ही, आपको बाद में अपने minions को यह समझाना होगा कि आपके eval का उपयोग अच्छा क्यों है, और उनका बुरा।
और, ज़ाहिर है, आपका PHP पर्ल की तरह लग रहा है;)
Eval के साथ दो मुख्य समस्याएं हैं (), ("इंजेक्शन हमले" परिदृश्य के रूप में):
1) इससे नुकसान हो सकता है 2) यह बस दुर्घटनाग्रस्त हो सकता है
और एक जो अधिक सामाजिक-से-तकनीकी है:
3) यह एक शॉर्टकट के रूप में अनुचित रूप से इसका उपयोग करने के लिए लोगों को लुभाएगा
पहले मामले में, आप मनमाना कोड निष्पादन के जोखिम (जाहिर है, तब नहीं जब आप एक ज्ञात स्ट्रिंग को निकाल रहे हों) चलाते हैं। हालाँकि, आपके इनपुट्स ज्ञात या तय नहीं किए जा सकते हैं।
अधिक संभावना (इस मामले में) आप बस दुर्घटनाग्रस्त हो जाएंगे, और आपका स्ट्रिंग गंभीर रूप से अस्पष्ट त्रुटि संदेश के साथ समाप्त हो जाएगा। IMHO, सभी कोड को यथासंभव बड़े करीने से विफल करना चाहिए, यह विफल होना चाहिए कि इसे एक अपवाद फेंकना चाहिए (जैसा कि त्रुटि का सबसे अधिक अप्रचलित रूप है)।
मेरा सुझाव है कि, इस उदाहरण में, आप व्यवहार के लिए कोडिंग के बजाय संयोग से कोडिंग कर रहे हैं। हाँ, एसक्यूएल एनम स्टेटमेंट (और क्या आपको यकीन है कि फील्ड की एनम? - क्या आपने डेटाबेस के राइट वर्जन के राइट टेबल के राइट फील्ड को कॉल किया था? क्या वास्तव में इसका जवाब था?) PHP में ऐरे डिक्लेरेशन सिंटैक्स जैसा दिखता है? लेकिन मैं सुझाव दूंगा कि आप वास्तव में क्या करना चाहते हैं, इनपुट से आउटपुट तक का सबसे छोटा रास्ता नहीं है, बल्कि निर्दिष्ट कार्य से निपटना है:
- पहचानें कि आपके पास एक एनम है
- भीतरी सूची निकालें
- सूची मूल्यों को अनपैक करें
जो मोटे तौर पर आपका विकल्प एक करता है, लेकिन मैं कुछ स्पष्ट और सुरक्षा के लिए इसके चारों ओर टिप्पणी करता हूं (जैसे, यदि पहला मैच मेल नहीं खाता है, तो अपवाद छोड़ दें या शून्य परिणाम सेट करें)।
अभी भी बच गए अल्पविराम या उद्धरण के साथ कुछ संभावित मुद्दे हैं, और आपको संभवतः डेटा को अन-कोट करना चाहिए, फिर भी यह कोड के बजाय डेटा के रूप में डेटा का कम से कम इलाज करता है।
Preg_version के साथ आपका सबसे बुरा परिणाम $ result = null होने की संभावना है, eval संस्करण के साथ सबसे खराब अज्ञात है, लेकिन कम से कम एक दुर्घटना।
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);