繁体   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