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

Php 如何替换字符串中的第一个匹配项?,php,regex,replace,preg-replace,Php,Regex,Replace,Preg Replace,我试图用数组中的值替换字符串中的每个问号“” 我需要遍历一个字符串,并用一个值替换字符串中第一个出现的“?”。我每次都要这么做 这是我试过的 function sprintf2($str='', array $values = array(), $char = '?') { if (!$str){ return ''; } if (count($values) > 0) { foreach ($values as $valu

我试图用数组中的值替换字符串中的每个问号“”

我需要遍历一个字符串,并用一个值替换字符串中第一个出现的“?”。我每次都要这么做

这是我试过的

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

我做错了什么?为什么会出现此异常?

您需要使用反斜杠(“\?”而不是“?”)对regexp中的“?”符号进行转义

但是,您的代码可以很容易地重构为使用preg_replace_回调:

$params = array(1, 3);
$str = '? bla ?';
echo preg_replace_callback('#\?#', function() use (&$params) {
    return array_pop($params);
}, $str);

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

但是,
str_replace
始终替换所有匹配项,无法将其限制为仅第一个匹配项(
preg_replace
类似)。第四个参数不是限制,它是一个设置为找到和替换的匹配数的变量。要仅替换一个匹配项,您可以组合
strop
substr\u 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;
}

希望此代码对您有所帮助

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);
函数sprintf2($string='',array$values=array(),$char='?'))
{
如果(!$string){
返回“”;
}
如果(计数($value)>0)
{
$spolded=explode($char,$string);
$i=0;
$string='';
foreach($细分为$段){
如果($i

说明:
在代码中,您使用的是preg_匹配,preg_匹配方法中的第一个参数是regex模式。你想替换的是什么?具有0或1个字符的有效含义。所以,你必须通过做\?来逃避这一点?。虽然不需要对所有字符进行转义,但是为了使方法工作,必须检查对任何正则表达式有效的字符。

在我的代码中,我已将字符串拆分为所需的字符。然后将我们从数组中得到的值附加到部分的末尾。这应该一直执行到值数组的值长度,否则会发生偏移错误

你可能会从准备好的陈述中受益。看看这个。和。@showdev我实际上想打印在服务器上执行的实际查询。我想把它打印成纯文本来评估它的价值。“如果不需要替换规则(如正则表达式),则应始终使用此函数而不是preg_replace()。@Barmar这对我不起作用。首先,我需要将数字1替换为以数字1为值的值。现在,它似乎正在用相同的值替换每个事件。根据文档,您的代码应该可以工作。这是我的代码
$count=1;foreach($value形式的绑定){$sql=str_replace('?',$value,$sql,$count)}echo$sql'
'
我们都误解了
str_replace
preg_replace
$count
参数。它不是对替换次数的限制,而是一个参考参数,用于获取替换次数。由于函数将字符串作为参数,因此应使用
preg_quote
对其进行转义。解释可能会有所帮助。问题是什么?您的代码是如何解决的?