Preg_replace shim có hỗ trợ eval
Điều này là rất khó lường. Nhưng nếu bạn không phải là một lập trình viên, hoặc thực sự thích mã khủng khiếp, bạn có thể sử dụng một preg_replace
hàm thay thế để giữ cho /e
cờ của bạn hoạt động tạm thời .
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
);
}
Về bản chất, bạn chỉ cần đưa chức năng đó vào cơ sở mã của mình và chỉnh sửa preg_replace
thành preg_replace_eval
bất /e
kỳ nơi nào cờ được sử dụng.
Ưu và nhược điểm :
- Thực sự chỉ được thử nghiệm với một vài mẫu từ Stack Overflow.
- Chỉ hỗ trợ các trường hợp dễ (gọi hàm, không phải tra cứu biến).
- Chứa thêm một số hạn chế và thông báo tư vấn.
- Sẽ gây ra các lỗi sai lệch và khó hiểu hơn đối với các lỗi diễn đạt.
- Tuy nhiên, vẫn là một giải pháp tạm thời có thể sử dụng và không làm phức tạp quá trình chuyển đổi thích hợp sang
preg_replace_callback
.
- Và nhận xét về giấy phép chỉ nhằm mục đích ngăn chặn mọi người lạm dụng hoặc lan truyền điều này quá xa.
Trình tạo mã thay thế
Bây giờ điều này là hơi thừa. Nhưng có thể giúp những người dùng vẫn còn quá tải với việc cấu trúc lại mã của họ theo cách thủ công preg_replace_callback
. Mặc dù điều này thực sự tốn nhiều thời gian hơn, nhưng trình tạo mã ít gặp khó khăn hơn khi mở rộng /e
chuỗi thay thế thành một biểu thức. Đó là một chuyển đổi không đáng kể, nhưng có thể đủ cho các ví dụ phổ biến nhất.
Để sử dụng chức năng này, hãy chỉnh sửa bất kỳ preg_replace
cuộc gọi bị hỏng nào vào preg_replace_eval_replacement
và chạy nó một lần . Điều này sẽ in ra theo preg_replace_callback
khối sẽ được sử dụng ở vị trí của nó.
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";
}
Hãy nhớ rằng chỉ sao chép và dán không phải là lập trình. Bạn sẽ phải điều chỉnh mã đã tạo trở lại với tên biến đầu vào / đầu ra thực tế của mình hoặc ngữ cảnh sử dụng.
- Cụ thể,
$OUTPUT =
nhiệm vụ sẽ phải thực hiện nếu preg_replace
cuộc gọi trước đó được sử dụng trong if
.
- Tốt nhất nên giữ các biến tạm thời hoặc cấu trúc khối mã đa dòng.
Và biểu thức thay thế có thể yêu cầu cải tiến hoặc làm lại khả năng đọc nhiều hơn.
- Ví dụ,
stripslashes()
thường trở nên thừa trong các biểu thức nghĩa đen.
- Tra cứu phạm vi biến yêu cầu một
use
hoặc global
tham chiếu cho / trong lệnh gọi lại.
- Các
"-$1-$2"
tham chiếu chụp kèm theo dấu ngoặc kép không đồng đều sẽ kết thúc bằng cách chuyển đổi thành "-$m[1]-$m[2]
.
Đầu ra mã chỉ là một điểm bắt đầu. Và có, điều này sẽ hữu ích hơn như một công cụ trực tuyến. Cách tiếp cận viết lại mã này (chỉnh sửa, chạy, chỉnh sửa, chỉnh sửa) hơi không thực tế. Tuy nhiên, có thể dễ tiếp cận hơn với những người đã quen với việc mã hóa tập trung vào nhiệm vụ (nhiều bước hơn, nhiều khám phá hơn). Vì vậy, thay thế này có thể hạn chế một số câu hỏi trùng lặp hơn.