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
です。
長所と短所:
- 本当にStackOverflowからのいくつかのサンプルでテストされました。
- 簡単なケースのみをサポートします(変数ルックアップではなく関数呼び出し)。
- さらにいくつかの制限と注意事項が含まれています。
- 式の失敗に対して、ずれた、理解しにくいエラーが発生します。
- ただし、それでも使用可能な一時的な解決策であり、への適切な移行を複雑にすることはありません
preg_replace_callback
。
- そして、ライセンスコメントは、人々がこれを使いすぎたり広めすぎたりするのを阻止することを目的としています。
置換コードジェネレータ
現在、これはやや冗長です。ただし、コードを手動でに再構築することにまだ圧倒されているユーザーには役立つ可能性がありますpreg_replace_callback
。これは事実上より時間がかかりますが、コードジェネレーターは/e
置換文字列を式に展開するための問題が少なくなります。これは非常に目立たない変換ですが、最も一般的な例にはおそらく十分です。
この関数を使用するには、壊れたpreg_replace
呼び出しを編集しpreg_replace_eval_replacement
て1回実行します。これにより、代わりに使用される対応するブロックが印刷さ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]
ます。
コード出力は単なる出発点です。はい、これはオンラインツールとしてもっと便利だったでしょう。このコード書き換えアプローチ(編集、実行、編集、編集)はやや実用的ではありません。それでも、タスク中心のコーディングに慣れている人にはもっと親しみやすいかもしれません(より多くのステップ、より多くの発見)。したがって、この代替案は、さらにいくつかの重複する質問を抑制する可能性があります。