Php 用str_replace模拟sprintf行为?

Php 用str_replace模拟sprintf行为?,php,Php,基本上我有这样的情况: $search = array( '?', '?' ); $replace = array( '1', '2' ); 当我尝试时: str_replace($search,$replace,"First value: ? Second Value: ?"); 我得到: "First value: 1 Second Value: 1" //> Notice the "1" repetead 而不是 "First value: 1 S

基本上我有这样的情况:

$search = array(
   '?',
   '?'
);

$replace = array(
   '1',
   '2'
);
当我尝试时:

str_replace($search,$replace,"First value: ? Second Value: ?");
我得到:

"First value: 1 Second Value: 1"  //> Notice the "1" repetead
而不是

 "First value: 1 Second Value: 2"

即使不使用str_replace,我如何获得第二个结果?

不要为此使用str_replace。使用该函数是错误的

或者,改变你的想法?通过对每个人都不同的东西。例如:

$search = array(
   '\1',
   '\2'
);
$replace = array(
   'firstValue',
   'secondValue'
);
str_replace($search,$replace,"First value: \\1 Second Value: \\2");

不要为此使用str_replace。使用该函数是错误的

或者,改变你的想法?通过对每个人都不同的东西。例如:

$search = array(
   '\1',
   '\2'
);
$replace = array(
   'firstValue',
   'secondValue'
);
str_replace($search,$replace,"First value: \\1 Second Value: \\2");
具有限制参数,因此您可以使用该参数:

$search = array(
   '/\?/',
   '/\?/'
);

$replace = array(
   '1',
   '2'
);

echo preg_replace($search, $replace, "First value: ? Second Value: ?", 1);

// output: First value: 1 Second Value: 2
您可以使用来构建搜索数组:

preg_replace(array_fill(0, count($replace), '/\?/'), $replace, $subject, 1);
具有限制参数,因此您可以使用该参数:

$search = array(
   '/\?/',
   '/\?/'
);

$replace = array(
   '1',
   '2'
);

echo preg_replace($search, $replace, "First value: ? Second Value: ?", 1);

// output: First value: 1 Second Value: 2
您可以使用来构建搜索数组:

preg_replace(array_fill(0, count($replace), '/\?/'), $replace, $subject, 1);

如果替换的数量已知或有限,则可以简单地使用字符串格式化函数。我喜欢使用vsprintf,因为它很容易将替换值附加到堆栈中

在这种情况下,要使用vsprintf获得所需的结果:

$subject = 'First value: %s Second Value: %s';
$values = array('1', '2');
echo vsprintf($subject, $values);

如果替换的数量已知或有限,则可以简单地使用字符串格式化函数。我喜欢使用vsprintf,因为它很容易将替换值附加到堆栈中

在这种情况下,要使用vsprintf获得所需的结果:

$subject = 'First value: %s Second Value: %s';
$values = array('1', '2');
echo vsprintf($subject, $values);

用str_替换不可能。您需要在原始字符串上重复循环,找到每个字符串?并单独更换。@MarcB:你是说我需要做一个foreach吗?str_replace不可能。您需要在原始字符串上重复循环,找到每个字符串?你的意思是我需要做一个foreach吗?只有当你有两个问号的时候才行。如果你有两个以上?若要替换,它将不起作用。@roychri:如何不起作用?举个例子。代码对我来说是正确的。只有在你有两个问号的情况下才有效。如果你有两个以上?若要替换,它将不起作用。@roychri:如何不起作用?举个例子。代码对我来说是正确的。那么你应该使用sprintf。你为什么不用它?只需执行$new=call_user_func_数组'sprintf',arraystr_replace?,%s,第一个值:?第二个值:?,$replace然后应该使用sprintf。你为什么不用它?只需执行$new=call_user_func_数组'sprintf',arraystr_replace?,%s,第一个值:?第二个值:?,$replace