str_replace只替换特定的事件?

时间:2012-03-28 09:21:41

标签: php mysql regex str-replace

我有这个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()替换所有匹配项。

是否有可以选择仅替换特定事件的选项?

5 个答案:

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

它将搜索一个闭括号后跟一个左括号,然后将查找最新的闭括号

实施例: http://xrg.es/#b1uu3f

答案 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,并再次将其替换为第二个...

http://au.php.net/manual/en/function.str-replace.php