我有这个SQL命令:
$sql = "INSERT INTO foo (value, value2, value3)
VALUES (value1, value2, value3)";
我想用)
替换第一个, custom_value)
,
类似地,第二个)
与, 1234567890)
结果应该是:
$sql = "INSERT INTO foo (value, value2, value3, custom_value)
VALUES (value1, value2, value3, 1234567890)";
我尝试使用str_replace()
替换所有匹配项。
是否有可以选择仅替换特定事件的选项?
答案 0 :(得分:1)
尝试以下方法:
$sql = str_replace('value3', 'value3, %s', $sql);
$sql = sprintf($sql, 'custom_value', '1234567890');
在我的本地设置上测试:
$sql = '(value, value2, value3) (value1, value2, value3)';
$sql = str_replace('value3', 'value3, %s', $sql);
$sql = sprintf($sql, 'custom_value', '1234567890');
// produces (value, value2, value3, custom_value) (value1, value2, value3, 1234567890)
echo $sql;
这是一个可重复使用的功能:
function replace_occurence($search, $replace, $subject) {
$subject = str_replace($search, '%s', $subject);
array_unshift($replace, $subject);
return call_user_func_array('sprintf', $replace);
}
$sql = '(value, value2, value3) (value1, value2, value3)';
$sql = replace_occurence(')', array(', custom_value)', ', 123456790)'), $sql);
答案 1 :(得分:1)
对于您给出的示例..您可以使用此正则表达式:
#(\).+?\(.+)(\))#
在PHP代码中,它看起来像这样:
$sql = preg_replace("#(\).+?\(.+)(\))#",
", custom_value\1, 1234567890\2",
$sql, -1, $count);
它将搜索一个闭括号后跟一个左括号,然后将查找最新的闭括号
答案 2 :(得分:1)
PHP的基本功能集中没有这样的东西。但您可以使用substr_replace()
实现它。
$sql = "foo (bar, baz, blub) bar (boo, far, faz)";
// only replace first occurance
$firstpos = strpos($sql, ')');
$sql = substr_replace($sql, ', custom_value)', $firstpos, 1);
// only replace second occurance
$secondpos = strpos( $sql, ')', strpos( $sql, ')' ) + 1);
$sql = substr_replace( $sql, ', 123456)', $secondpos, 1);
echo $sql, PHP_EOL;
结果:
foo (bar, baz, blub, custom_value) bar (boo, far, faz, 123456)
重写为可重复使用的功能:
function str_replace_occurance($search, $replace, $subject, $occurance) {
$pos = NULL;
for ($i = 1; $i <= $occurance; $i++) {
$pos = strpos($subject, $search, ($pos===NULL) ? 0 : $pos+1);
}
return substr_replace($subject, $replace, $pos, strlen($search));
}
$sql = str_replace_occurance(')', ', custom_value)', $sql, 1);
$sql = str_replace_occurance(')', ', 1234567890)', $sql, 2);
echo $sql, PHP_EOL;
修改:重新排序的参数与原始str_replace
答案 3 :(得分:-1)
如果你有php&gt; 5.0您可以使用count
中的str_replace
来设置所需的替换次数。
答案 4 :(得分:-1)
如果仅使用str_replace,那么str_replace的限制为1st,并再次将其替换为第二个...