2014-05-09 167 views
0

我工作的一個內容管理器BB代碼的系統上,我希望能夠在我的textarea使用類似[code=php]<?php echo "Hello World!"; ?>[/code]。使用GeSHi(語法高亮)我已經做了以下功能來解析代碼:PHP代碼不執行

function parsecode($codetype) { 
    $source = file_get_contents("file.php"); 
    $language = $codetype; 
    $geshi = new GeSHi($source, $language); 
    echo '<code class="num">', implode(range(1,count(file("file.php"))), "<br />"), "</code>"; 
    echo $geshi->parse_code(); 
} 

這工作得很好!

現在,這是在那裏對BB代碼來自於使用了preg_replace我做了一個簡單的系統,查找和替換的碼位:

$find = array( 
    "/\[code\=(.+?)\](.+?)\[\/code\]/is" 
); 
$replace = array(
    '<?php parsecode("$1"); ?>' 
); 

是的,現在這意味着它只能讀取語言和解析文件「file.php」,但最終我會有這個工作不同,但現在並不重要。

會發生什麼,是BB代碼得到正確執行,結果是它確實執行代碼,但它不執行函數parsecode()。我做了一個小調整,找出問題所在,並將其保存到一個文件中,結果發現該文件包含以下內容:<?php parsecode("php"); ?>。這正是它應該包含的內容。當我在文件中寫入這行代碼時,它會執行。在textarea的提交

凡是被存儲在一個文件中,然後使用fopen()讀取,然後在不同的頁面中回顯。

我的問題:爲什麼不函數執行&解析像它應該的代碼?

謝謝!

回答

1

只有一種方式來獲得PHP代碼(動態變化的代碼)在PHP代碼中執行,這是用的eval()。

http://www.php.net/manual/en/function.eval.php

這使你可以動態地使代碼並執行它

請記住這句話,雖然: 「如果的eval()答案是,你幾乎可以肯定問錯了問題 - 拉斯姆斯·勒多夫,PHP」

的eval BDFL()是已知的安全漏洞和被利用。極不推薦。 但是,只要你沒有在eval中使用用戶生成的代碼,你會沒事的。你可以在它周圍放置一個回報,只在數據庫中得到結果。

您可以通過腳本運行此而不更換它它的條目,但該論壇網頁上運行,而不是之前達到同樣的效果......

+1

很抱歉這麼晚纔回復,我去後睡覺一小時。所以基本上這是做到這一點的唯一方法。在我的情況下,我有一個穩固的登錄系統,但當然總是有辦法解決這個問題,所以這確實是不鼓勵的。那麼我的問題仍然存在,我怎麼能做到這一點呢?我怎麼能做出一個BB代碼結構,允許你輸入'[code = php] <?php echo「Hello World!」; ?> [/ code]'並且使用原始文章中的代碼進行渲染?我相信這是可能的,但我不知道如何..謝謝你的回覆:) – BananaMan

+0

這裏的另一個解決方案: 爲什麼不做語法高亮客戶端? 有一個庫,例如highlight.js可以做到這一點: 的http:// highlightjs。org/ 然後,您可以簡單地使用javascript來完成客戶端的所有分析或準備處理腳本中的HTML,並簡單地運行HTML,因爲它來自數據庫。 – Ruby

+0

我確實越過了highlightjs.org幾次,但我不知道如何將其構建成一個功能性的BB代碼:/ – BananaMan