簡體   English   中英

PHP preg_replace使用發現的表達式作為鍵的可變值

[英]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_replacepreg_replace_callback是這樣的:

$src = preg_replace_callback('/%%(ITEM[ABC])%%/i', function ($m) use ($replacements) {
 return isset($replacements[$m[1]]) ? $replacements[$m[1]] : $m[0];
}
, $src);

IDEONE演示

問題是\\1反向引用只能在模式內部用於引用第一個捕獲組捕獲的文本或在替換模式內部,但只能用作其文字部分。 \\1不會自動求值以用作參數。

我也縮小了模式,但我猜只是一個示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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