preg_replace shim with 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]
.
코드 출력은 단지 시작점 일뿐입니다. 그리고 예, 이것은 온라인 도구로 더 유용했을 것입니다. 이 코드 재 작성 방식 (편집, 실행, 편집, 편집)은 다소 비실용적입니다. 그러나 작업 중심 코딩에 익숙한 사람들에게 더 접근하기 쉬울 수 있습니다 (더 많은 단계, 더 많은 발견). 따라서이 대안은 몇 가지 중복 질문을 더 억제 할 수 있습니다.