如何替换字符串中的第一个匹配项?

时间:2015-11-11 23:13:40

标签: php regex replace preg-replace

我正在尝试更换每个问号“?”在一个包含数组值的字符串中。

我需要经历一个字符串,并替换第一次出现'?'在带有值的字符串中。我需要在每次出现时都这样做

这是我试过的

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);

我在这里做错了什么?为什么我会得到这个例外?

3 个答案:

答案 0 :(得分:2)

使用str_replace代替preg_replace,因为您正在替换文字字符串,而不是正则表达式模式。

但是,str_replace总是替换所有匹配项,没有办法将其限制为仅第一次匹配(preg_replace类似)。第四个参数不是限制,它是一个变量,它被设置为找到和替换的匹配数。要只替换一个匹配项,您可以合并strpossubstr_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;
}

DEMO

答案 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 具有有效含义。所以,你可以通过 \?来逃避这种情况。虽然不需要转义所有字符,但是,为了使您的方法有效,您必须检查对任何正则表达式有效的字符。
在我的代码中,我已经为你想要的角色分割了字符串。然后在我们从数组中获得的部分末尾附加值。这应该完成,直到值数组的值长度,否则将发生偏移错误。

相关问题