2012-10-29 216 views
6

我試圖讓我的客戶端通過在他們的所見即所得編輯器中插入一個簡短代碼來調用具有各種代碼片段的函數。php替換正則表達式而不是字符串替換

例如,他們會喜歡寫東西......

[getSnippet(1)] 

這會打電話給我的getSnippet($ id)的PHP函數,輸出相應的 '塊'。

它工作時,我硬編碼的$ id像這樣...

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']); 

可是,我真的想使「1」的動態。我是那種正軌的東西像...

function getSnippet($id) { 
if ($id == 1) { 
    echo "car"; 
} 
} 

$string = "This [getSnippet(1)] is a sentence.This is the next one."; 
$regex = '#([getSnippet(\w)])#'; 
$string = preg_replace($regex, '. \1', $string); 

//If you want to capture more than just periods, you can do: 
echo preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string); 

不太工作:(

+0

什麼不適用於您的代碼? – hakre

+0

看看'preg_replace_callback()'。它允許您提供一個函數,該函數接收由正則表達式匹配的字符串的位,並返回替換。 – Barmar

回答

0

首先在你的正則表達式,你需要添加文字括號(你剛纔捕獲\w的那些,但這將不匹配括號本身):

$regex = '#(\[getSnippet\((\w)\)\])#'; 

我也逃過了方括號,否則會打開一個字符類也知道,這僅捕獲一個參數字符

但我建議你使用preg_replace_callback,用這樣的正則表達式:

function getSnippet($id) { 
    if ($id == 1) { 
     return "car"; 
    } 
} 

function replaceCallback($matches) { 
    return getSnippet($matches[1]); 
} 

$string = preg_replace_callback(
    '#\[getSnippet\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

請注意,我在你的getSnippet改變echoreturn

在回調$matches[1]內將包含第一個捕獲組,在這種情況下是您的參數(現在允許多個字符)。當然,你也可以調整你的getSnippet函數從$matches數組中讀取id而不是通過replaceCallback重定向。

但是這種方法稍微靈活一點,因爲它可以讓你重定向到多個功能。舉個例子,如果你將正則表達式改爲#\[(getSnippet|otherFunction)\((\w+)\)\]#,那麼你可以找到兩個不同的函數,並且replaceCallback可以找到$matches[1]中函數的名稱,並用參數$matches[2]調用該函數。像這樣:

function getSnippet($id) { 
    ... 
} 

function otherFunction($parameter) { 
    ... 
} 

function replaceCallback($matches) { 
    return $matches[1]($matches[2]); 
} 

$string = preg_replace_callback(
    '#\[(getSnippet|otherFunction)\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

這真的取決於你想要去哪裏。重要的是,在沒有使用preg_replace_callback的情況下,無法在替換中處理任意參數。

+0

非常感謝您的快速回復。這一點看起來非常接近。當我使用字符串,如... '$ string =「[getSnippet(1)] this ijioj oiajs dfoij dsofij aoisfj oiasdfj。[getSnippet(2)] adfas asd as f。」;' 我只是從函數返回文本,但丟失其他文本... 'ie:汽車。船。' 但它應該是... '再次 「車。這ijioj oiajs dfoij dsofij aoisfj oiasdfj。船。adfas ASD爲f。」' 感謝。 –

+0

你的答案非常符合我的要求,只是我的句子中的其他文字被刪除。只剩下由函數調用返回的文本。再次感謝。 –

+0

請將'getSnippet'中的'echo'改爲'return'。我以爲我改變了這一點,但顯然我在那裏做了一些複製粘貼錯誤。 –