我正在尝试更换每个问号“?”在一个包含数组值的字符串中。
我需要经历一个字符串,并替换第一次出现'?'在带有值的字符串中。我需要在每次出现时都这样做
这是我试过的
function sprintf2($str='', array $values = array(), $char = '?')
{
if (!$str){
return '';
}
if (count($values) > 0)
{
foreach ($values as $value)
{
$str = preg_replace('/'. $char . '/', $value, $str, 1);
}
}
echo $str;
}
但我收到以下异常
preg_replace():编译失败:无法在偏移0处重复
以下显示了我如何调用函数
$bindings = array(10, 500);
$str = "select * from `survey_interviews` where `survey_id` = ? and `call_id` = ? limit 1";
sprintf2($str, $bindings);
我在这里做错了什么?为什么我会得到这个例外?
答案 0 :(得分:2)
使用str_replace
代替preg_replace
,因为您正在替换文字字符串,而不是正则表达式模式。
但是,str_replace
总是替换所有匹配项,没有办法将其限制为仅第一次匹配(preg_replace
类似)。第四个参数不是限制,它是一个变量,它被设置为找到和替换的匹配数。要只替换一个匹配项,您可以合并strpos
和substr_replace
:
function sprintf2($str='', array $values = array(), $char = '?')
{
if (!$str){
return '';
}
if (count($values) > 0)
{
$len = strlen($char);
foreach ($values as $value)
{
$pos = strpos($str, $char);
if ($pos !== false) {
$str = substr_replace($str, $value, $pos, strlen($char));
}
}
}
echo $str;
}
答案 1 :(得分:1)
你需要逃避'?'使用反斜杠登录正则表达式(' \?'而不是'?')。
但您的代码可以很容易地重构为使用preg_replace_callback而不是:
$params = array(1, 3);
$str = '? bla ?';
echo preg_replace_callback('#\?#', function() use (&$params) {
return array_pop($params);
}, $str);
答案 2 :(得分:0)
希望此代码可以帮助您。
function sprintf2($string = '', array $values = array(), $char = '?')
{
if (!$string){
return '';
}
if (count($values) > 0)
{
$exploded = explode($char, $string);
$i = 0;
$string = '';
foreach ($exploded as $segment) {
if( $i < count($values)){
$string .= ($segment . $values[$i]);
++$i;
}
}
}
echo $string;
}
$bindings = array(10, 500);
$str = "select * from `survey_interviews` where `survey_id` = ? and `call_id`= ? limit 1";
echo sprintf2($str, $bindings);
说明:的
在您的代码中,您使用preg_match并且preg_match方法中的第一个参数是正则表达式模式。您尝试替换的是?对于 0或1 CHARACTER 具有有效含义。所以,你可以通过 \?来逃避这种情况。虽然不需要转义所有字符,但是,为了使您的方法有效,您必须检查对任何正则表达式有效的字符。
在我的代码中,我已经为你想要的角色分割了字符串。然后在我们从数组中获得的部分末尾附加值。这应该完成,直到值数组的值长度,否则将发生偏移错误。