PHP用变量替换字符串内的字符

时间:2014-12-05 22:07:14

标签: php string str-replace

简而言之,我试图取代所有的“?”使用变量中的值,它不起作用。请帮忙。

    $string = "? are red ? are blue";
    $count = 1;

    update_query($string, array($v = 'violets', $r = 'roses'));


    function update_query($string, $values){

        foreach ( $values as $val ){

            str_replace('?', $val, $string, $count);    
        }

        echo $string;
    }

我得到的输出是:?是红色的 ?是蓝色的

6 个答案:

答案 0 :(得分:2)

由于没有注意的人感到沮丧,我不得不正确地回答这个问题

str_replace将替换搜索字符串的所有实例。因此,在violets之后,roses将无需替换。

可悲的是,str_replace没有带限制参数,但preg_replace有。但实际上你可以用preg_replace_callback做得更好,就像这样:

function update_query($string, $values){
    $result = preg_replace_callback('/\?/', function($_) use (&$values) {
        return array_shift($values);
    }, $string);
    echo $string;
}

答案 1 :(得分:0)

您忘了将其设置为等于您的变量。

$string = str_replace('?', $val, $string, $count); 

答案 2 :(得分:0)

您可能希望从新字符串中捕获str_replace的返回值,并为每次替换时回显它,并通过引用传递$ count。

   foreach ( $values as $val ){

        $newString = str_replace('?', $val, $string, &$count);    
        echo $newString;
   }

答案 3 :(得分:0)

这是最好和最干净的方法

  <?php

  $string = "? are red ? are blue";
  $string = str_replace('?','%s', $string);
  $data = array('violets','roses');

  $string = vsprintf($string, $data);  

  echo $string;

您的代码已编辑

$string = "? are red ? are blue";

update_query($string, array('violets','roses'));


function update_query($string, $values){

  $string = str_replace('?','%s', $string);
  $string = vsprintf($string, $values);

    echo $string;
}

答案 4 :(得分:0)

好的家伙在这里是一些好帖子的解决方案。

$string = "? are red ? are blue";

update_query($string, array($v = 'violets', $r = 'roses'));

function update_query($string, $values){

    foreach ( $values as $val ){

        $string = preg_replace('/\?/', $val, $string, 1);

    }

    echo $string;
}

如上所述,preg_replace将允许限制更新的匹配数量。谢谢大家。

答案 5 :(得分:0)

您可以通过两种方式解决此问题:

1)用各自的值替换问号。有一百种方法可以解决它,但对于这样的事情,我更喜欢用老式的方式做:找到问号并用新的值一个一个地替换它们。如果$arr中的值包含问号,那么它们将被忽略。

function update_query($str, array $arr) {
    $offset = 0;
    foreach ($arr as $newVal) {
        $mark = strpos($str, '?', $offset);
        if ($mark !== false) {
            $str = substr($str, 0, $mark).$newVal.substr($str, $mark+1);
            $offset = $mark + (strlen($newVal) - 1);
        }
    }
    return $str;
}
$string = "? are red ? are blue";
$vars = array('violets', 'roses');
echo update_query($string, $vars);

2)或者您可以轻松自己并使用唯一标识符。这使您的代码更易于理解,更易于预测和强大。

function update_query($str, array $arr) {
    return strtr($str, $arr);
}
echo update_query(':flower1 are red :flower2 are blue', array(
    ':flower1' => 'violets',
    ':flower2' => 'roses',
));

您甚至可以使用strtr(),但将其包装在一个您可以更容易记住的功能中(以及在您的代码中有意义的功能)也可以使用。

哦,如果你打算用它来创建一个SQL查询,那么你应该重新考虑一下。请改用数据库驱动程序的预备语句。