[英]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.