প্রাক সমর্থন সঙ্গে shim
এটি খুব অবাঞ্ছিত। তবে আপনি যদি প্রোগ্রামার না হয়ে থাকেন বা সত্যই ভয়ঙ্কর কোডটি পছন্দ করেন তবে আপনি 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
।
- এবং লাইসেন্স মন্তব্যটি কেবলমাত্র এটিকে অতিরিক্ত ব্যবহার করা বা ছড়িয়ে দেওয়া থেকে বিরত রাখতে to
প্রতিস্থাপন কোড জেনারেটর
এখন এটি কিছুটা অপ্রয়োজনীয়। তবে সেই ব্যবহারকারীদের যারা তাদের কোডটিতে ম্যানুয়ালি পুনর্গঠন করে এখনও অভিভূত হয়েছেন তাদের সহায়তা করতে পারে preg_replace_callback
। যদিও এটি কার্যকরভাবে বেশি সময় সাশ্রয়ী, একটি কোড জেনারেটরের /e
প্রতিস্থাপনের স্ট্রিংটিকে একটি এক্সপ্রেশন হিসাবে প্রসারিত করতে কম সমস্যা হয় । এটি একটি অত্যন্ত অবিস্মরণীয় রূপান্তর, তবে সম্ভবত সবচেয়ে প্রচলিত উদাহরণগুলির পক্ষে যথেষ্ট suff
এই ফাংশনটি ব্যবহার করতে, কোনও ভাঙা 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
।
- যদিও অস্থায়ী ভেরিয়েবলগুলি বা মাল্টলাইন কোড ব্লক কাঠামো রাখা ভাল।
এবং প্রতিস্থাপনের অভিব্যক্তি আরও পাঠযোগ্যতার উন্নতি বা পুনরায় কাজের দাবি করতে পারে demand
- উদাহরণস্বরূপ
stripslashes()
আক্ষরিক ভাবের মধ্যে প্রায়ই নিরর্থক হয়ে ওঠে।
- পরিবর্তনশীল-স্কোপ লুকের জন্য কলব্যাকের মধ্যে / এর জন্য একটি
use
বা global
রেফারেন্স প্রয়োজন ।
- অসমতে উদ্ধৃত-আবদ্ধ
"-$1-$2"
ক্যাপচার রেফারেন্সগুলি প্লেইন ট্রান্সফর্মেশনের মাধ্যমে সিন্টেক্সিকভাবে ভেঙে যাবে "-$m[1]-$m[2]
।
কোড আউটপুটটি কেবল একটি সূচনা পয়েন্ট is এবং হ্যাঁ, এটি অনলাইন সরঞ্জাম হিসাবে আরও কার্যকর হত। এই কোড রাইটারিং এপ্রোচ (সম্পাদনা, রান, সম্পাদনা, সম্পাদনা) কিছুটা অবৈধ। তবুও যারা টাস্ককেন্দ্রিক কোডিং (আরও পদক্ষেপ, আরও উদ্ঘাটন) এর অভ্যস্ত তাদের কাছে আরও সহজলভ্য হতে পারে। সুতরাং এই বিকল্পটি আরও কয়েকটি সদৃশ প্রশ্ন রোধ করতে পারে।