참고. (예 : $vars['s'] = '%s';
..) 따라서 데이터에 이러한 구문이 없는지 확인하십시오. 주석 처리 된 코드
// if(!is_numeric($expanded) || (substr($expanded.'',0,1)==='0'
// && strpos($expanded.'', '.')===false)) {
..
// }
은 사용하거나 건너 뛸 수 있습니다. 건너 뛴 경우 문자열 $str
이 나중에 평가 될 경우 대체가 인용됩니다! 하지만 PHP는 자동으로 문자열을 숫자로 변환하기 때문에 (또는 그렇게해야한다고 말합니까?) 코드를 건너 뛰어도 문제가 발생하지 않아야합니다. 부울 값은 지원되지 않습니다. 그것은 폐쇄를 사용하기 때문에 PHP 5.3
<?
$vars['a'] = 'This is a string';
$vars['b'] = '123';
$vars['d'] = '%c';
$vars['e'] = '^5 + %d';
$vars['f'] = '^11 + %e + %b*2';
$vars['g'] = '^date(\'l\')';
$vars['h'] = 'Today is %g.';
$vars['i'] = 'Zip: %j';
$vars['j'] = '';
$vars['input_digits'] = '*****';
$vars['code'] = '%input_digits';
function expand($str, $vars) {
$regex = '/\%(\w+)/';
$eval = substr($str, 0, 1) == '^';
$res = preg_replace_callback($regex, function($matches) use ($eval, $vars) {
if(isset($vars[$matches[1]])) {
$expanded = expand($vars[$matches[1]], $vars);
if($eval) {
// Special handling since $str is going to be evaluated ..
// if(!is_numeric($expanded) || (substr($expanded.'',0,1)==='0'
// && strpos($expanded.'', '.')===false)) {
$expanded = "'$expanded'";
// }
}
return $expanded;
} else {
// Variable does not exist in $vars array
if($eval) {
return 'null';
}
return $matches[0];
}
}, $str);
if($eval) {
ob_start();
$expr = substr($res, 1);
if(eval('$res = ' . $expr . ';')===false) {
ob_end_clean();
die('Not a correct PHP-Expression: '.$expr);
}
ob_end_clean();
}
return $res;
}
echo expand('^1 + %c',$vars);
echo '<br/>';
echo expand('^%a != NULL',$vars);
echo '<br/>';
echo expand('^3+%f + 3',$vars);
echo '<br/>';
echo expand('%h',$vars);
echo '<br/>';
echo expand('Your code is: %code',$vars);
echo '<br/>';
echo expand('Some Info: %i',$vars);
?>
위의 코드는 가정 (또한 '진실'또는 적합한 논리 값을 'false'로!와 같은 문자열을 변환 PHP 수행에는 자동 변환이 없음).
출력 : PHP < 5.3 다음과 같은 적응 코드
1
1
268
Today is Tuesday.
Your code is: *****
Some Info: Zip:
사용할 수 있습니다 :
function expand2($str, $vars) {
$regex = '/\%(\w+)/';
$eval = substr($str, 0, 1) == '^';
$res = preg_replace_callback($regex, array(new Helper($vars, $eval),'callback'), $str);
if($eval) {
ob_start();
$expr = substr($res, 1);
if(eval('$res = ' . $expr . ';')===false) {
ob_end_clean();
die('Not a correct PHP-Expression: '.$expr);
}
ob_end_clean();
}
return $res;
}
class Helper {
var $vars;
var $eval;
function Helper($vars,$eval) {
$this->vars = $vars;
$this->eval = $eval;
}
function callback($matches) {
if(isset($this->vars[$matches[1]])) {
$expanded = expand($this->vars[$matches[1]], $this->vars);
if($this->eval) {
// Special handling since $str is going to be evaluated ..
if(!is_numeric($expanded) || (substr($expanded . '', 0, 1)==='0'
&& strpos($expanded . '', '.')===false)) {
$expanded = "'$expanded'";
}
}
return $expanded;
} else {
// Variable does not exist in $vars array
if($this->eval) {
return 'null';
}
return $matches[0];
}
}
}
쉬운 질문이 아닙니다. 예를 들어 순환 참조를 생각해 보셨습니까? '$ var [ 'a'] = '% b'; $ var [ 'b'] = '% a';'. 또는 이것이 일어나지 않을 것이라고 추측 될 수도 있습니다. – NikiC
순환 참조를 감지 할 수 있다면 좋겠지 만, 그 해결책을 아는 사람이 있습니까? 우리가 그 문제에 대한 해결책을 찾지 못한다면, 우리는 그들이 일어나지 않을 것이라고 가정 할 것입니다 ... –