2011-05-23 73 views
1

我想知道是否可以在字符串中執行php代碼。我的意思是如果我有:識別並執行字符串上的php代碼

$string = If i say <?php echo 'lala';?> I wanna get "<?php echo 'dada'; ?>"; 

有沒有人知道如何?

[編輯]看起來沒人理解。我想保存一個字符串,如

$string = If i say <?php count(array('lala'));?> 

在數據庫中,然後呈現它。我可以用

function render_php($string){ 
    ob_start(); 
    eval('?>' . $string); 
    $string = ob_get_contents(); 
    ob_end_clean(); 
    return $string; 
} 

的問題是,我不reconize PHP代碼爲「」(引號)像

I say "<?php echo 'dada'; ?>" 
+3

請澄清你的問題。這裏的字符串的價值是什麼?所以你想能夠識別給定的字符串是否是有效的PHP代碼?你將無法用正則表達式來做到這一點。 – 2011-05-23 21:24:07

+2

取決於來源。如果這是用戶輸入,我不能真正推薦'eval()',因爲這些該死的靈魂將來自陰間的深淵,將我折磨爲永恆。如果你不小心,你也可能被利用。 – 2011-05-23 21:30:58

+0

您不能在''標籤內使用''標籤 – Hubro 2011-05-23 21:44:45

回答

-1

您可以使用eval()功能做到這一點。

+1

或者(更好的是)不要使用,特別是如果所討論的字符串來自* any *形式的用戶輸入。 :-) – 2011-05-23 21:32:23

+0

是的。你必須謹慎使用eval。 – fiunchinho 2011-05-23 21:34:30

+0

請參閱編輯; – 2011-05-23 22:36:08

1

看起來像你試圖連接。使用連接運算符「。」

$string = "if i say " . $lala . " I wanna get " . $dada; 

$string = "if i say {$lala} I wanna get {$dada}."; 

這就是我得到的,因爲你的字符串看起來是一個PHP變量。

編輯:當你要告訴PHP解釋器,在這些括號中的代碼應該被解釋爲PHP <?php ?>使用。在這些PHP括號內工作時,不需要再次包含它們。所以,當你只想做:

// You create a string: 
$myString = "This is my string."; 

// You decide you want to add something to it. 
$myString .= getMyNameFunction(); // not $myString .= <?php getMyNameFunction() ?>; 

字符串創建,然後getMyNameFunction的結果()被附加到它。現在,如果你宣佈你的頁面的頂部$ MyString的變量,並希望以後使用它,你會做這樣的:

<span id="myString"><?php echo $myString; ?></span> 

這將告訴解釋到標籤之間添加$的myString變量的內容。

+0

這是一個例子。其實我想用<?php echo implode($ lalala); ?>或類似的東西 – 2011-05-23 21:36:17

+0

何塞:見編輯。 – John 2011-05-23 22:11:59

+0

請參閱修改。 – 2011-05-23 22:35:56

2
$string = ($test === TRUE) ? 'lala' : 'falala'; 

有很多方法可以做到什麼樣子,你正在試圖做的(如果我讀你寫正確的)。以上是三元組。如果條件評估爲真,那麼$ string將被設置爲'lala',否則設置爲'falala'。

如果你真的在問你寫的是什麼,那麼使用eval()函數。它接受一個傳遞的字符串並執行它,就像它是php代碼一樣。不要包含<?php ?>標籤。

function dropAllTables() { 
    // drop all tables in db 
} 

$string = 'dropAllTables();'; 

eval($string); // will execute the dropAllTables() function 

[編輯]

您可以使用下面的正則表達式來找到所有的PHP代碼:

preg_match_all('/(<\?php)(.+?)(\?>)/', $string, $php_code, PREG_OFFSET_CAPTURE); 

$ php_code將是一個數組,其中$ php_code [0]會返回所有與代碼+ <?php ?>標籤匹配的數組。$ php_code [2]將是一個只有執行代碼的數組。

所以,

$string = "array has <?php count(array('lala')); ?> 1 member <?php count(array('falala')); ?>"; 
preg_match_all('/(<\?php)(.+?)(\?>)/', $string, $php_code, PREG_OFFSET_CAPTURE); 
echo $php_code[0][0][0]; // <?php count(array('lala')); ?> 
echo $php_code[2][0][0]; // count(array('lala')); 

這應該是你想做的事情有幫助。

+0

請參閱編輯; – 2011-05-23 22:36:02

0

在字符串上使用token_get_all(),然後查找T_OPEN_TAG令牌,從那裏開始複製,查找T_CLOSE_TAG令牌並在此停止。在T_OPEN_TAG旁邊的令牌和T_CLOSE_TAG之前的令牌之間的字符串是您的PHP代碼。

這很快並且不會失敗,因爲它使用PHP的標記器來分析字符串。即使字符串包含註釋或其他可能包含?>或任何其他可能會混淆正則表達式或手寫慢速純PHP解析器的相關子字符串,您仍然可以在字符串中找到PHP代碼位。

0

我會考慮不將您的PHP代碼塊存儲在數據庫中,並使用eval評估它們。通常有更好的解決方案。閱讀設計模式,OOP,多態性。