PHP preg_replace() 索引数组问题

3
这是程序:
$string = 'Inquiry {{inquiry:number}} is assigned to {{details_1}}';
$patterns = array();
$patterns[0] = '/({{)(.*)(}})/U';
$patterns[1] = '/({{)(.*)(}})/U';
$replacements = array();
$replacements[1] = 15;
$replacements[0] = 20;
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);

它应该给出以下输出:
Inquiry 20 is assigned to 15

但是我得到的是:
Inquiry 20 is assigned to 20

我在想这是否与 preg_replace 有关?注意:我试图用相应的值替换包括花括号在内的 {{..}} 中的字符串。
3个回答

3
$replArray = array(
  '{{inquiry:number}}',
  '{{details_1}}'
);

$valueArray = array (15,20);
echo str_replace($replArray,$valueArray,$patern);

如果您想使用模板,您需要解析变量并检查正确的队列,例如{}是正确的,而{{}}则不正确。

1
很遗憾,我无法明确放置替换文本,因为它们是动态生成的。这里的字符串是众多可能情况之一。我没有在此处提及它,以保持帖子简短。但还是谢谢建议。 - Pranay

3

默认情况下,preg_replace 会替换所有出现的字符串。只需在您的脚本中添加可选参数“limit”,它就会起作用:

echo preg_replace( $patterns, $replacements, $string, 1 );

这个解决方案对我来说似乎是最好的。将每个匹配项的出现次数限制为1,正好可以实现我想要达到的目的。谢谢! - Pranay
@Pranay,你可能想考虑采用其他答案中提到的方法,明确地输入你想要匹配的文本。这样,如果你以后改变了文本的顺序或删除了其中一个,也不会破坏你的整个脚本。 - Mike
@Mike:我不能明确地放置替换文本,因为它们是动态生成的。我的字符串在此处仅仅是众多可能情况之一。不过,感谢你的建议。 - Pranay

2

这是因为替换是依次进行的,您的模式#0匹配{{}}中的所有内容,因此两个占位符都被替换为您的替换#0。

当处理模式#1时,没有更多的{{}}了。

试试这个:

$string = 'Inquiry {{inquiry:number}} is assigned to {{details_1}}';
$patterns = array();
$patterns[0] = '/({{)(inquiry:number)(}})/U';
$patterns[1] = '/({{)(details_1)(}})/U';
$replacements = array();
$replacements[1] = 15;
$replacements[0] = 20;
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);

很遗憾,我无法明确提供替换文本,因为它们是动态生成的。这里的字符串只是众多可能情况之一。 为了保持帖子简短,我没有在这里提及它。还是谢谢你的建议。 - Pranay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接