如何创建自己的 php 模板系统?
How to create own php templating system?
我有两个名为 test.txt
的文件将包含模板 code.I 需要评估此模板以由 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 templating ,我们尝试使用自定义的可变代码在某些场景中执行。
这是我为此使用的算法:
NOTE put the template code in $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);
我有两个名为 test.txt
的文件将包含模板 code.I 需要评估此模板以由 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 templating ,我们尝试使用自定义的可变代码在某些场景中执行。
这是我为此使用的算法:
NOTE put the template code in
$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);