[英]PHP preg_replace with variable value using found expression as key
我有一個帶有兩個可變占位符%%itemA%%
和%%itemB%%
的字符串$src
。 這個想法是讓正則表達式不區分大小寫地匹配ITEMA|ITEMB|ITEMC
列出的任何術語,並使用該術語作為數組關鍵字將其替換為數組項的值。
$replacements = [
'itemA' => 'replacedItemA',
'itemB' => 'replacedItemB',
'itemC' => 'replacedItemC'
];
$src = "A B C %%itemA%% D E F %%itemB%% G H I";
$src = preg_replace('/\%\%(ITEMA|ITEMB|ITEMC)%%/i', $replacements['\1'], $src);
echo $src;
在此示例中,預期結果是將%%itemA%%
替換為$replacements['itemA']
的值,並將%%itemB%%
替換為$replacements['itemB']
的值
echo
預期輸出為
ABC替換項目A DEF替換項目B GHI
奇怪的是,實際輸出只是簡單地將發現的條件替換為什么(注意刪除了變量的雙空格)
ABCDEFGHI
為什么在$replacements['key']
不使用術語的字符串來使用數組變量的值?
您的方法是錯誤的。 由於您正在處理文字字符串,因此可以避免使用正則表達式並使用更快的方法:
$replacements = [
'%%itemA%%' => 'replacedItemA',
'%%itemB%%' => 'replacedItemB',
'%%itemC%%' => 'replacedItemC'
];
$str = strtr($str, $replacements);
你只需要更換preg_replace
與preg_replace_callback
是這樣的:
$src = preg_replace_callback('/%%(ITEM[ABC])%%/i', function ($m) use ($replacements) {
return isset($replacements[$m[1]]) ? $replacements[$m[1]] : $m[0];
}
, $src);
問題是\\1
反向引用只能在模式內部用於引用第一個捕獲組捕獲的文本或在替換模式內部,但只能用作其文字部分。 \\1
不會自動求值以用作參數。
我也縮小了模式,但我猜只是一個示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.