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)
而不是使用问号,为什么不使用这样的标记:
$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)
归档时间: |
|
查看次数: |
7341 次 |
最近记录: |