php模板字符串替換----PHP 替換模板變量實現步驟----PHP的(<<


方法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 <<前面,腳本也不會有內容內容。
具體什么原因,就留給大家去討論了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM