<?php class PStr extends Packer{ var $symbol; function __construct($str){ parent::__construct($str); $this->symbol=$symbol; } public function fill(){ $args=func_get_args(); return $this->fillHash($args,'@'); } private function fillCallBack($symbol,$key,$fmtbody,$hs){ $value=$hs[$key]; $fmtbody=str_replace('//"','"',$fmtbody); /* fillHash 中的 preg_replace 在回调时会转义引号(")为(/"),在这里需转回 */ preg_match('/(/w+)(?:/:(.+))?/',$fmtbody,$m); $value=$hs[$key]; $ar=preg_split('/(?<!):/',$fmtbody); for($i=0;$i<count($ar);$i++){ switch($ar[$i]){ case 'r': $value=$_REQUEST[$key]; break; case 'd': $body=$ar[++$i]; $value=$this->formatDate($body,$value); break; case 'h': $body=$ar[++$i]; $dic=PStr($body)->toHash('='); $value=$dic[$value]; case 't': $body=$ar[++$i]; $dic=PStr($body)->toHash('='); if(array_key_exists($value,$dic)){ $value=$dic[$value]; } break; case 'f': $body=$ar[++$i]; $value=$body($value); break; //--------------modify-------------- case 'eval': $exp=$ar[++$i]; $exp=preg_replace('/([/:/$/}])/','$1',$exp); //转义还原 $t=preg_split('/(?<!);/',$exp); $t[count($t)-1]='return '.$t[count($t)-1].';'; $exp=implode(';',$t); $value=eval($exp); break; //--------------modify-------------- } } return $value; } public function fillHash($hs,$symbol='@',&$obj=null,$func='fillCallBack'){ if($hs==null )$hs=array(); foreach($hs as $k=>$v){ if(gettype($v)=='array')$hs[$k]=implode(',',$v); } if($symbol=='$')$symbol='//$'; //--------------modify-------------- $r='//{('.$symbol.')(/w+?)(?::((?:}|[^}])+?))?/}/e'; //--------------modify-------------- if($obj==null)$obj=$this; return preg_replace($r,"/$obj->/$func('$1','$2','$3',/$hs)",$this->packin); } public function formatDate($fmt,$str){ if(strtotime($str)){ $str=date($fmt,strtotime($str)); //'Y-m-d h:i:s' } return $str; } /* 形如,----键:值,键:值----字符串不带引号. */ public function toHash($d=':') { $r='/((?:[^,'.$d.']|'.$d.')+)'.$d.'(.+?)(?=,[^,]+'.$d.'|$)/'; $h=array(); preg_match_all($r,$this->packin,$ar,PREG_SET_ORDER); foreach($ar as $i=>$match){ $h[$match[1]]=$match[2]; } return $h; } } function PStr($str){ return new PStr($str); } ?>