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

sas*_*asa 8 php regex preg-replace

我需要一个简单而快速的解决方案来替换字符串中的第n个匹配(占位符).

例如,sql查询中的第n个问号应替换为提供的值.

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

所以,我需要函数str_replace_nth($seach, $replace, $subject, $nth)和第二个问号,它应该被称为str_replace_nth("?", $username, $subject, 2);

有任何想法吗?

PS请不要建议我使用PDO,因为我正在使用FDO(Facebook数据对象)一个具有类似于PDO的接口的库,但是对于FQL.

重要的提醒!我已经发现这种方法很糟糕,因为在第一次替换之后,查询被修改并且索引丢失了.(当你在深夜编程时出现不好的方法:()所以,正如@GolezTrol在评论中提到的那样,最好立刻替换所有.

bit*_*ing 14

这是您要求的功能:

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

function str_replace_nth($search, $replace, $subject, $nth)
{
    $found = preg_match_all('/'.preg_quote($search).'/', $subject, $matches, PREG_OFFSET_CAPTURE);
    if (false !== $found && $found > $nth) {
        return substr_replace($subject, $replace, $matches[0][$nth][1], strlen($search));
    }
    return $subject;
}

echo str_replace_nth('?', 'username', $subject, 1);
Run Code Online (Sandbox Code Playgroud)

注意:$nth是基于零的索引!

但我建议使用以下内容替换占位符:

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

$args = array('1', 'steve');
echo vsprintf(str_replace('?', '%s', $subject), $args);
Run Code Online (Sandbox Code Playgroud)


Rap*_*lié 6

而不是使用问号,为什么不使用这样的标记:

$subject = "SELECT uid FROM users WHERE uid = :uid or username = :username";
$parameters = array(
    ':uid' => 42,
    ':username' => 'John',
);
$subject = str_replace(array_keys($parameters), $parameters, $subject);
Run Code Online (Sandbox Code Playgroud)