preg_replace eval सपोर्ट के साथ शिम
यह बहुत ही असावधान है। लेकिन अगर आप एक प्रोग्रामर नहीं हैं, या वास्तव में भयानक कोड पसंद करते हैं, तो आप एक विकल्प का उपयोग कर सकते हैंpreg_replace
अपने /e
ध्वज को अस्थायी रूप से काम करने के फ़ंक्शन का ।
function preg_replace_eval($pattern, $replacement, $subject, $limit=-1) {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
if (preg_match('/\(\.[+*]/', $pattern)) {
trigger_error("preg_replace_eval(): regex contains (.*) or (.+) placeholders, which easily causes security issues for unconstrained/user input in the replacement expression. Transform your code to use preg_replace_callback() with a sane replacement callback!");
}
return preg_replace_callback(
$pattern,
function ($matches) use ($replacement) {
$repl = preg_replace_callback(
'/(?<!\\\\)(?:[$]|\\\\)(\d+)/',
function ($m) use ($matches) {
if (!isset($matches[$m[1]])) { trigger_error("No capture group for '$m[0]' eval placeholder"); }
return addcslashes($matches[$m[1]], '\"\'\`\$\\\0');
},
$replacement
);
return eval("return $repl;");
},
$subject,
$limit
);
}
संक्षेप में, आप उस फ़ंक्शन को अपने कोडबेस में शामिल करते हैं, और जहाँ भी ध्वज का उपयोग किया गया था , उसे संपादित preg_replace
करते हैं ।preg_replace_eval
/e
पेशेवरों और विपक्ष :
- वास्तव में सिर्फ स्टैक ओवरफ्लो के कुछ नमूनों के साथ परीक्षण किया गया।
- केवल आसान मामलों का समर्थन करता है (फ़ंक्शन कॉल, वेरिएबल लुकअप नहीं)।
- कुछ और प्रतिबंध और सलाहकार नोटिस शामिल हैं।
- अभिव्यक्ति विफलताओं के लिए अव्यवस्थित और कम समझदार त्रुटियों का उत्पादन करेगा।
- हालांकि अभी भी एक प्रयोग करने योग्य अस्थायी समाधान है और इसके लिए एक उचित संक्रमण को जटिल नहीं करता है
preg_replace_callback
।
- और लाइसेंस टिप्पणी का मतलब सिर्फ लोगों को इस से दूर करने या फैलाने से रोकना है।
रिप्लेसमेंट कोड जनरेटर
अब यह कुछ हद तक बेमानी है। लेकिन उन उपयोगकर्ताओं की मदद कर सकते हैं जो अभी भी अपने कोड को मैन्युअल रूप से पुनर्गठन करने से अभिभूत हैं preg_replace_callback
। जबकि यह प्रभावी रूप से अधिक समय लेने वाला है, एक कोड जनरेटर को /e
एक अभिव्यक्ति में प्रतिस्थापन स्ट्रिंग का विस्तार करने के लिए कम परेशानी होती है । यह एक बहुत ही अचूक रूपांतरण है, लेकिन सबसे अधिक प्रचलित उदाहरणों की संभावना है।
इस फ़ंक्शन का उपयोग करने के लिए, किसी भी टूटी हुई preg_replace
कॉल को संपादित करें preg_replace_eval_replacement
और इसे एक बार चलाएं । यह उसके स्थान पर उपयोग किए जाने वाले अनुसार preg_replace_callback
ब्लॉक का प्रिंट आउट लेगा ।
function preg_replace_eval_replacement($pattern, $replacement, $subjectvar="IGNORED") {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
$replacement = preg_replace_callback('/[\'\"]?(?<!\\\\)(?:[$]|\\\\)(\d+)[\'\"]?/', function ($m) { return "\$m[{$m[1]}]"; }, $replacement);
$ve = "var_export";
$bt = debug_backtrace(0, 1)[0];
print "<pre><code>
#----------------------------------------------------
# replace preg_*() call in '$bt[file]' line $bt[line] with:
#----------------------------------------------------
\$OUTPUT_VAR = preg_replace_callback(
{$ve($pattern, TRUE)},
function (\$m) {
return {$replacement};
},
\$YOUR_INPUT_VARIABLE_GOES_HERE
)
#----------------------------------------------------
</code></pre>\n";
}
ध्यान रखें कि केवल कॉपी और पेस्ट करना ही प्रोग्रामिंग नहीं है। आपको अपने वास्तविक इनपुट / आउटपुट चर नामों या उपयोग के संदर्भ में उत्पन्न कोड को वापस अनुकूलित करना होगा।
$OUTPUT =
यदि पिछले preg_replace
कॉल का उपयोग किया गया था तो विशिष्ट रूप से असाइनमेंट को जाना होगा if
।
- हालाँकि अस्थायी चर या बहु-कोड ब्लॉक संरचना को रखना सबसे अच्छा है।
और प्रतिस्थापन अभिव्यक्ति अधिक पठनीयता सुधार या पुन: काम की मांग कर सकती है।
- उदाहरण के लिए
stripslashes()
अक्सर शाब्दिक अभिव्यक्तियों में निरर्थक हो जाता है।
- वैरिएबल-स्कोप लुकअप की आवश्यकता होती है
use
याglobal
कॉलबैक के भीतर / के लिए संदर्भ।
- असमान रूप से उद्धृत-संलग्न
"-$1-$2"
कैप्चर संदर्भ, सादे परिवर्तन द्वारा वाक्य-रचना को तोड़ देगा "-$m[1]-$m[2]
।
कोड आउटपुट केवल एक प्रारंभिक बिंदु है। और हाँ, यह एक ऑनलाइन टूल के रूप में अधिक उपयोगी होता। यह कोड पुनर्लेखन दृष्टिकोण (संपादित करें, चलाएं, संपादित करें, संपादित करें) कुछ अव्यवहारिक है। फिर भी उन लोगों के लिए अधिक स्वीकार्य हो सकता है जो कार्य-केंद्रित कोडिंग के आदी हैं (अधिक कदम, अधिक खुलासे)। तो यह विकल्प कुछ और डुप्लिकेट प्रश्नों पर अंकुश लगा सकता है।