2014-09-05 28 views
0

我在定製的CMS中使用了Redactor編輯器。 Redactor有一個選項,phpTags,當設置爲true時,允許將PHP代碼輸入並保存爲內容的一部分。如何處理文本字符串中的PHP代碼,以防止它被視爲文本?

問題是,此PHP代碼被視爲文本,而不是PHP代碼,並且正在被轉義而不是被處理。

例如,如果我在編輯器中輸入:

<?php echo date('Y'); ?>

取而代之的是今年的顯示,代碼在頁面的標記註釋,像這樣:

<!--?php echo date('Y'); ?-->

我該如何防止這種情況發生?確保PHP代碼是由服務器處理/解釋的?

我應該提到有很多人使用這個CMS,所以沒有辦法知道可以提前添加什麼PHP代碼。

+0

請與我們分享您的嘗試。 – 2014-09-05 17:58:05

+0

在使用之前,您是否必須啓用對phpTags的支持? – Brian 2014-09-05 18:00:37

+0

@JayBlanchard我首先嚐試了str_replace來用'<?php'替換'<! - ?php',並且同樣關閉了PHP標記。這並沒有導致顯示在他網頁上的內容沒有任何改變。然後,我直接查看數據庫,並且代碼存在,因爲它應該是。數據從數據庫中檢索並傳遞給一個使用'echo'在頁面上顯示的函數,所以'echo'文本包含格式正確的PHP代碼。看起來瀏覽器正在將PHP解釋爲文本,並將其註釋掉。 – 2014-09-05 21:37:27

回答

0

要解決這個問題,我把之前剛剛通過echo顯示的內容,保存到臨時文件中。

然後我打開輸出緩衝,將該臨時文件包含在PHP腳本中,並通過ob_get_contents()獲取其內容。

這使我能夠在解析完所有PHP後顯示內容。下面的代碼以供參考:

// Create path to temporary file 
$tmpPath = '/temp.php'; 

// Set file variable to null for error checking 
$tmpFile = NULL; 

// Try creating the temporary file 
if ($tmpFile = fopen($tmpPath, 'w')) { 
    if (fwrite($tmpFile, $postContent) === FALSE) { 
     // Do something if the file can't be written to 
    } else { 
     // Close file 
     fclose($tmpFile); 
    } 
} 

// Start output buffereing 
ob_start(); 

// Include the temporary file created above 
include $tmpPath; 

// Save buffered contents to a variable 
$content = ob_get_contents(); 

// End output buffering 
ob_end_clean(); 

// Display content 
echo $content; 

我很欣賞的各種評論我的問題,因爲它有助於督促我在正確的方向得到這個想通了。

0

也許

<!-- <?php echo date('Y') ?> --> 

你不能改變PHP的打開/關閉標籤,如你是不是沒有PHP的重新編譯。如果你想隱藏php的輸出,然後用html評論標籤來包圍整個php代碼塊。

PHP不會在乎html的評論。它根本不在乎它所嵌入的內容。只要將Web服務器配置爲通過PHP解釋器運行.jpg文件,就可以將PHP代碼塊插入到.jpg文件的中間,並且它仍然會執行。

+0

當存儲在數據庫中時,PHP代碼是正確的(即沒有被註釋掉)。只有在瀏覽器在文本字符串中看到PHP代碼並將其註釋掉時,纔會回顯到頁面上(我假設)。我在這裏猜測,PHP代碼並沒有被視爲代碼,因此瀏覽器爲什麼會將其註釋掉。我的目標是防止它被註釋掉,所以服務器將它處理爲PHP代碼而不是格式化文本。 – 2014-09-05 21:40:42

相關問題