簡體   English   中英

php替換正則表達式而不是字符串替換

[英]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
);

請注意,我將getSnippetecho更改為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM