[英]How to replace a nth occurrence in a string
我需要一個簡單快速的解決方案來替換字符串中的第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在評論中提到的,最好一次全部替換掉。
這是您要求的功能:
$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);
注意: $nth
是從零開始的索引!
但我建議使用類似以下的內容替換占位符:
$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";
$args = array('1', 'steve');
echo vsprintf(str_replace('?', '%s', $subject), $args);
除了使用問號之外,為什么不使用這樣的標記:
$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);
輸入參數驗證未完成
function str_replace_nth($search, $replace, $subject, $nth){
$match_arr = explode($search,$subject);
$match_arr = array_filter($match_arr);
foreach($match_arr as $key=>$val){
if($key == $nth-1){ // array index start with Zero
$match_arr[$key] .= $replace;
}else{
$match_arr[$key] .= '?';
}
}
return implode('',$match_arr);
}
您的解決方案都不適合我,因此我做到了:
$sql1 = "SELECT * FROM allegro_user WHERE User_Emp_Nb = ? AND User_Activ_status = ?";
$sql2 = "SELECT * FROM allegro_user WHERE User_Emp_Nb = :emp_nb AND User_Activ_status = :activ";
function prepare_query($sql, $args) {
foreach ($args as $key => $value) {
if (is_numeric($key)) {
$sql = preg_replace('/\?/', "'" . $value . "'", $sql, 1);
} else {
$sql = str_replace($key, "'" . $value . "'", $sql);
}
}
return $sql;
}
tab($sql1);
$sql = prepare_query($sql1, array('0216313', 'A'));
tab($sql1);
tab($sql2);
$sql = prepare_query($sql2, array(':emp_nb' => '0216313', ':activ' => 'A'));
tab($sql2);
tab()只是我用於打印的功能:
echo '<pre>';
print_r($tab);
echo '</pre>';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.