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
був використаний прапор.
Плюси і мінуси :
- Дійсно щойно протестовано з кількома зразками з Stack Overflow.
- Підтримує лише прості випадки (виклики функцій, а не перегляди змінних).
- Містить ще кілька обмежень та дорадчих повідомлень.
- Видалять дислоковані та менш зрозумілі помилки для помилок виразів.
- Однак це все ще придатне тимчасове рішення і не ускладнює правильний перехід на
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]
.
Вихід коду - це лише вихідна точка. І так, це було б більш корисно як інструмент в Інтернеті. Цей підхід до переписування коду (редагування, запуск, редагування, редагування) є дещо недоцільним. І все-таки може бути більш доступним для тих, хто звик до кодування, орієнтованого на завдання (більше кроків, більше розкриттів). Тож ця альтернатива може стримувати ще кілька дублікатів запитань.