【问题标题】:How to create own php templating system?如何创建自己的php模板系统?
【发布时间】:2016-09-22 13:27:17
【问题描述】:

我有两个文件名test.txt,其中包含模板代码。我需要评估这个模板以由 php 评估。 EVAL() 函数在 ifelse 和其他类似条件下给出了一些错误。

test.txt

@$firmware_path=true;
@$DIALPLAN=1312321;
@$MAX_LINES=3;
@$data=array();
@$OPERATOR_IP='';
@$enabled=true;
@ if ($firmware_path) 
@{
    firmware server: http://{$OPERATOR_IP}{$firmware_path}
@ }



@ for ($i = 1; $i <= $MAX_LINES; $i++)
@ {
    @ $enabled = isset($LINES[$i - 1]);
    @ if ($enabled) 
    @{
        @ $data = $LINES[$i -1];

        @ if ($data['USER_FULLNAME']) 
        @{
            @ if ($PHONE_LABEL) 
            @{
                @ $screenName = $data['USER_FULLNAME'] . ' ' . $data['TELNUM'];
                @ $screenName2 = $PHONE_LABEL;
            @ } 
            @else 
            @{
                @ $screenName = $data['USER_FULLNAME'];
                @ $screenName2 = $data['TELNUM'];
            @ }
        @ } 
        @else 
        @{
            @ $screenName = $data['TELNUM'];
            @ $screenName2 = $PHONE_LABEL;
        @ }

    @ }
@ }

index.php

<?php

$file = fopen("test.txt","r");
$arr=array();
while(! feof($file))
{
  $arr[]=fgets($file);
}


$format='';
foreach($arr as $key=>$value)
{
  if(substr(ltrim($value), 0, 1) === '@')
  {
    $result=str_replace('@','',$value);

    $format.=$result.PHP_EOL;

  }
  else
  {

    $format.='$final="'.$value.'";';
  }

}


 $format.=' return $final;';
echo eval($format);


?>

根据php生成结果

【问题讨论】:

标签: php eval templating


【解决方案1】:

我解决了这样的问题。类似于 php 模板,我们尝试在某些场景下使用自定义的可变代码来执行。

这是我用于此的算法:

注意把模板代码放在$arr

$arr=str_replace('transliterate','urldecode',$arr);

$format='$final="";';
foreach($arr as $key=>$value)
{
if(substr(ltrim($value), 0, 1) === '@')
{
//run it as php line through eval
$result=str_replace('@','',$value);

$format.=$result.PHP_EOL;

}
else
{
 // just echo as normal php echo line
 $value=str_replace('"','\"',$value);

 $value=str_replace('{','".(',$value);
 $value=str_replace('}',')."',$value);

 $format.='$final.="'.$value.'";'.PHP_EOL;
}

}

 $format.=' return $final;';

$evaled_result= eval($format);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多