2014-05-09 28 views
0

我對內容管理系統的工作,和我目前使用BB代碼有特殊字符的能力。這種設置的方式是使用2個數組,一個用於查找BB代碼,另一個用它需要替換的東西。問題與插入位的PHP代碼到一個數組

現在我遇到的問題是,我需要在系統請求時執行一點PHP代碼。我會怎麼做呢?這使得我的問題:我如何將一些PHP代碼插入到數組中?

我的代碼:

$replace = array(
    "@\[email protected]", 
    "/\[b\](.+?)\[\/b\]/is", 
    "/\[code\=(.+?)\](.+?)\[\/code\]/is" 
); 
$find = array(
    "<br />", 
    "<strong>$1</strong>", 
    "<?php include_once($_SERVER['DOCUMENT_ROOT'].'/source/geshi/geshi.php'); $source=file_get_contents('file.php'); $language='$1'; $geshi=new GeSHi($source, $language); echo'<code class=\"num\">', implode(range(1,count(file('file.php'))), '<br />'), '</code>'; echo $geshi->parse_code(); ?>" 
); 

,我得到的錯誤:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or   T_VARIABLE or T_NUM_STRING in /testing/bbcode.php on line 26 

感謝提前

編輯:對雙引號,反之亦然交換單一的伎倆!

現在我有一個問題:

當我有這樣的:

"/\[color\=(.+?)\](.+?)\[\/color\]/is", 

在我的$查找陣列,這在我的$取代數組:

"<font color=\"$1\">$2</font>", 

它工作正常,並將文本呈現爲輸入的顏色。現在用[代碼PHP =] [/代碼]例如,它不會在所有的渲染,只是顯示爲「[代碼PHP =] [/代碼]」彷彿呈現任何內容。我該如何解決這個問題?

+6

你需要它來執行由用戶輸入的PHP代碼?你瘋了? –

+1

如果是這樣,那麼確切地說有零種方法可以使這種安全方法和大約10億種方法來解決任何你可以想到的保護措施。一切從使用變量函數來連接變量來創建函數名稱,使用變量名稱的數字等等。你永遠無法保證這一點。和任何你的PHP腳本可以做的(這幾乎是你的服務器上的任何命令),你的用戶將能夠做你的服務器。 –

+0

@JonathanKuhn,沒有,由一個堅實的帳戶系統保護,只有我可以訪問,並且我讓它學習,它不會在任何地方的網站:) – BananaMan

回答

0

我不能完全肯定這將幫助你,但我會後在關閉的機會,你可以在你的代碼適應的解決方案。我建立我自己,從textarea接受輸入頁面,並在點擊一個按鈕,頁面將「執行」中的PHP代碼,並顯示它在textarea低於div輸出。因爲它在瀏覽器中,所以它甚至可以對JavaScript(和HTML/CSS)執行相同的操作,這使得它可以方便地進行快速測試。

它看起來像這樣:

enter image description here

它的工作原理,採取的PHP代碼從textarea,寫出來給一個臨時文件。文件寫入後,通過include語句將其包含在屏幕外緩衝區中。然後我將緩衝區捕獲到一個變量中,然後將其吐出到頁面上。

這是所有的,看起來像在實踐中:

$code = isset($_POST['code']) ? $_POST['code'] : ''; 

$filename = tempnam('.', '__'); 
file_put_contents($filename, $code); 

ob_start(); 

include $filename; 
$output = ob_get_clean(); 

unlink($filename); 

因爲你的PHP代碼實際上只是文本,可以將其分配到一個數組就像你的任何其他部分的數據:

$array = array(); 
$array[] = $code; 

如果你想從內存中的一個變量運行PHP代碼,而不是去到磁盤,您可以使用eval(),但它的工作原理有些不同,該代碼include方法有可能「迴歸」的東西。我不是這種方法的粉絲,但可以選擇。

$code = isset($_POST['code']) ? $_POST['code'] : ''; 
$result = eval($code); 

參考文獻:

+0

嘿,這是非常有用的,但並不能完全幫助我處理我的問題,因爲我的代碼沒有執行,但它讀取它,突出顯示它,並使用帶樣式的span進行回顯。不過謝謝,這當然是有用的! – BananaMan

+0

@BananaMan啊,那麼我一定誤解了你的問題。我以爲你試圖包含來自用戶可輸入源的PHP代碼。 :) – Cypher

+0

我的最終目標是基本的,就是使用GeSHi(A語法高亮系統),能夠做一些類似[code = php] <?php echo「Hello World」; ?> [/ code]放在textarea中,然後渲染它,然後用正確的語法回顯它(這是GeSHi的作用)。現在我遇到的問題是BB代碼:( – BananaMan