2010-08-03 158 views
0

我有一个字符串中有相同的字符多次,我想用数组中的不同字符串替换此字符的每个出现。即就像在准备好的发言:用不同的字符串替换几次相同的字符

字符串:"SELECT * FROM x WHERE a = ? AND b = ?"
阵:['alpha', 'beta']

结果:"SELECT * FROM x WHERE a = alpha AND b = beta"

+0

您正在使用什么数据库接口?它可能具有内置的能力(它可能更安全)。 – strager 2010-08-03 03:03:58

+0

是的,当然数据库接口有这个通常内置的,但我只是想要类似SQL的语法作为例子,因为大多数人已经知道它。在这里已经有一些很好的解决方案,我只是想弄清楚哪一个最适合我。 – Matt 2010-08-03 13:53:28

回答

7

如果您有过更换性格是什么样的控制,使用sprintf

sprintf('Hello %s, how %s %s?', 'World', 'are', 'you'); 

vsprintf

vsprintf('Hello %s, how %s %s?', array('World', 'are', 'you')); 

而且,即使你不这样做:

$str = 'Hello ?, I hope ? ?.'; 
$str = str_replace('?', '%s', $str); 
$str = sprintf($str, "World", "you're", "fine"); 
+0

这可能很难以编程方式使用,因为替换次数可能不固定。 ['vsprintf'](http://www.php.net/manual/en/function.vsprintf.php)是一个更好的解决方案。 – Artefacto 2010-08-03 03:27:12

+0

好点,取决于它应该如何使用。 – deceze 2010-08-03 03:28:49

+0

@deceze,他特别说“从数组中”,尽管我承认OP经常指向一个解决方案的中途,而这个解决方案并没有真正解决其根本问题。 – Artefacto 2010-08-03 03:35:34

3

试试这个:

$str = "SELECT * FROM x WHERE a = ? AND b = ?"; 
$arr = array("alpha", "beta"); 
foreach ($arr as $s) 
    $str = preg_replace("/\?/", $s, $str, 1); 
echo $str; 

here。第四个参数将每次运行的最大替代次数限制为一次而不是无限次。

+1

这可能是因为我认为正则表达式是魔鬼魔法,但这似乎不是一点点钝吗?看到修改问题的参数只是一点点,使得整体上更多的解决方案。 (请参阅sprintf) – 2010-08-03 03:15:41

+0

是的,您可能是对的,sprintf对于作者而言很可能已足够。但是,它并不像原始问题中指定的那样使用数组,这使得它成为一种更通用的方法(假设您需要数组)。 – XQYZ 2010-08-03 03:25:40

+0

有'vsprintf',他也可以使用'sprintf' +'call_user_func'(尽管最后一个会很尴尬)。 – Artefacto 2010-08-03 03:30:38

1

无正则表达式函数(作为奖励,也允许替换任意字符串,而不是只是字符):

function replacement($string, $search, array $replacements) { 
    $pos = 0; 
    while (($f = strpos($string, $search, $pos)) !== FALSE) { 
     $r = array_shift($replacements); 
     $string = substr($string, 0, $f) . $r . 
      substr($string, $f + strlen($search)); 
     $pos = $f + strlen($r); 
    } 
    return $string; 
} 

例子:

echo replacement("sf sdf aaasdf sdsaaaaggg", "aa", 
    array("alpha", "beta", "gammma")); 

给出:

 
sf sdf alphaasdf sdsbetagammmaggg
相关问题