2011-09-18 103 views
1

我有一個複雜的問題: 我有一個很長的文本,我需要在我的文本中調用一些PHP函數。 函數名稱是myfunction(); 我在我的文本中包含以下方式的功能: 「text text text myfunction [1,2,3,4,5]; more text text ...」如何在php中使用preg_replace來替換帶有函數結果的文本?

我想將每個函數myfunction的結果與[]括號中的變量一起使用。

我的代碼是:

<?php echo preg_replace('/myfunction[[0-9,]+]/i',myfunction($1),$post['content']); ?> 

,但它`不工作。

參數應該是一個數組,因爲它可以包含任意數量的值。

+0

請顯示您正在使用的代碼,目前我們無法看到它。 – iBobo

回答

1

如果我是你,我會避免使用e修飾符到preg_replace,因爲它可能導致您打開執行任意代碼。改爲使用preg_replace_callback。它稍微更詳細,但更有效:

echo preg_replace_callback('/myfunction\[([0-9,]+)\]/i', function($matches) { 
    $args = explode(',', $matches[1]); // separate the arguments 
    return call_user_func_array('myfunction', $args); // pass the arguments to myfunction 
}, $post['content']); 

這使用匿名函數。如果您在5.3之前使用PHP版本,則此功能將不可用。您必須創建一個命名函數,然後按照手冊頁上的說明使用該函數。

-1

您需要添加「e」修飾符,在正則表達式中轉義[],並將第二個參數字符串化。

preg_replace('/myfunction\[[0-9,]+\]/ei','myfunction("$1")',$post['content']); 
0

您可以使用preg_replace()的‘E’改性劑(用於EVAL)像這樣使用:

$text = preg_replace('/myfunction\[(.*?)\]/e', 'myfunction("$1")', $text); 

我並沒有真正得到怎樣你的數據是結構化的,因此就是我可以做目前幫助你。您可以探索該解決方案。

PHP Manual

E(PREG_REPLACE_EVAL) 如果設定了此修正符,preg_replace()做在替換字符串反向引用的正常取代,評估其作爲PHP代碼,並使用該結果用於替換搜索字符串。單引號,雙引號,反斜槓()和空字符將被替換的反向引用中的反斜槓轉義。

相關問題