[英]php replace regular expression instead of string replace
我試圖讓我的客戶端能夠通過在他們的WYSIWYG編輯器中插入一個簡短的代碼來調用具有各種代碼片段的函數。
例如,他們會寫類似......
[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);
不太正常:(
首先在你的正則表達式中你需要添加文字括號(你剛剛捕獲的那些括號\\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
的echo
更改為return
。
在回調中, $matches[1]
將包含第一個捕獲的組,在這種情況下是您的參數(現在允許多個字符)。 當然,您也可以調整getSnippet
函數來從$matches
數組中讀取id
,而不是通過replaceCallback
重定向。
但這種方法稍微靈活一些,因為它允許您重定向到多個功能。 舉個例子,如果你將正則表達式更改為#\\[(getSnippet|otherFunction)\\((\\w+)\\)\\]#
那么你可以找到兩個不同的函數,而replaceCallback
可以在$matches[1]
找到函數的名稱。 $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
,就無法在替換中處理任意參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.