方法1
寫這篇文章是由於最近一個項目中的滿減活動,要實現根據模板生成廣告,
話不多說,直接上代碼
/*
* 實現字符串模板解析
* @value string
* @data array
*@output string 解析模板后的字符串
* */
function getMbzStringAttr($value,$data){
foreach ($data as $key=>$v){
$$key =$v;
}
return eval('return "' . $value . '";');
}
$mbz_string = '滿{$amount}減{$pay_account}';
echo getMbzStringAttr($mbz_string,['amount'=>'20元','pay_account'=>'10元']);
方法2---使用eval方法,因為這種方法,太不安全,所以不建議使用
這是一個簡易的字符串模板引擎、數據庫模板引擎。區別於一般基於文件模板的引擎,這里的模板是一個字符串,因此可以將模板存於數據庫或其他地方,而且不是編譯型引擎,沒有緩存文件,因而就不涉及到目錄權限問題。模板的基本原理是將模板處理成全php腳本的字符串,然后用eval執行符串。至於安全問題,因為用到eval執行模板里面的語句,因此模板代碼必須是受信任的,大多數其他模板引擎也是這樣吧。
// 字符串模板,懶得構造字符串,這里直接讀取文件來模擬
$str = file_get_contents( 'tpl.php' );
// 首尾添加php腳本標簽,使所有原樣輸出的html文本處於php腳本標簽的中間
$str = "<?php if(1){?>{$str}<?php }?>";
// 用echo語句替換原樣輸出的html文本
$str = preg_replace_callback( '/\?>([\s\S]+?)<\?/', function ($m)
{
return '?><?php echo "' . addcslashes( $m[1], "\r\n\\\"" ) . '";?><?';
}, $str );
// 去掉php腳本標簽並執行標簽里面的代碼
eval( str_replace( array (
'<?php',
'?>'
), '', $str ) );
php模板替換的基本原理
$title="測試標題";
$file="測試內容";
//打開這個模板
$tempdata=fopen("test.html","r");
//讀取模板中的內容
$str=fread($tempdata,filesize("test.html"));
//替換模板中的內容
$str=str_replace('{$title}',$title,$str);
$str=str_replace('{$center}',$file,$str);
//輸出
echo $str;
好像是最終的方法
在W3school上學PHP,看到第一句就是“PHP 文件可包含文本、HTML 標簽以及腳本”
在后來的學習別人的代碼,發現在需要HTML代碼的PHP腳本中,多用這么幾種方法
第一種是在HTML中加PHP。大段大段的html代碼中,在各個需要執行php的地方。這種方法在ASP的程序中比較常見。
例子:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<title>Hello World</title><style>body{font-size:15px;color:#000;font-family:Arial,Helvetica,sans-serif;}a{color:#039;text-decoration:none;}</style>
</head><body></b>
<?php
echo "Hello world!這是正文";
?>
</b></body></html>
第二種用echo輸出HTML。但是HTML中有雙引號,所用echo輸出的內容用單引號括起來,避免出錯,也省了轉義這一步。比如這樣的代碼:
<?php
if(!$_POST)
{
echo '<form action="" method="post">
服務器地址:<input type="text" name="host" value="localhost" /><br />
數據庫賬號:<input type="text" name="user" value="" /><br />
數據庫密碼:<input type="password" name="pwd" value="" /><br />
指定數據庫:<input type="text" name="db" value="test" /><br />
<input type="submit" value="確定"/>
</form><hr/>說明:<b><br /></b>';
}
?>
不過比較多見的還是加了轉義符號的,個人覺得閱讀起來不爽
echo "<input type=\"submit\" value=\"確定\"/>"
第三種就是用(<<<)標記符了,這是在PHP168的模板代碼中首次見到的。
<<<EOT
EOT;
中間的文檔直接輸出,一個比較好理解的說法是“一個多行的echo ”。
優點是輸出大段HTML方便,不需要轉義,而且可以引用變量。一個例子:
<?php
print <<<EOT
<div class="slidecont">{$label[deepblue_mainslide]}</div>
<div class="newcontainter">
<div class="head">{$label[deepblue_mainh1]}</div>
<div class="cont" id="Tab1">
{$label[deepblue_maint1]}
</div>
<div class="cont" id="Tab2">
{$label[deepblue_maint2]}
</div>
</div>
<a href="$rs[url]" title="$rs[descrip]" target="_blank">$rs[name]</a>
EOT;
?>
在上面的例子干凈利索的輸出了大段HTML+變量的值,非常棒。
使用(<<<eot)的注意事項
標記符還有一點需要注意:標識符結束字符串既EOT;要獨占一行,前后都不許再有內容。
尤其容易犯的失誤就是在標識符前加空格和縮進符,下面的例子什么都不會輸出
東方天宇的博客 EOT; echo "喂~人家在等你呢!"; ?>我們會發現,最后的echo也沒有執行。這是因為(<<<eot)
沒有找到標識符結束字符,將echo語句也包含到需要輸入的內容了。
同時,因為沒有找到標識符結束字符所有的內容都不會輸出。
當然,這只是我的理解,因為即使將echo語句放在print <<前面,腳本也不會有內容內容。
具體什么原因,就留給大家去討論了。