代码之家  ›  专栏  ›  技术社区  ›  Young

用不同的字符串替换相同的字符

  •  5
  • Young  · 技术社区  · 15 年前

    假设我有一根绳子

    $str = "abc*efg*hij*";
    

    一个数组

    $arr = array("123","456","789");
    

    现在我想替换 * S在 $str 元素在 $arr 根据位置。第一个 * 换成 $arr[0] ,第二个替换为 $arr[1] 等等,我检查功能 str_replace 虽然它接受数组作为参数,但我发现它不起作用。

    $newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}"
    

    因为真正的 $STR 可能是一根很长的绳子,上面有很多 * 有什么好主意吗?谢谢。

    2 回复  |  直到 15 年前
        1
  •  12
  •   BoltClock    15 年前

    如果 * 是您唯一的格式字符,请尝试转换 * 到 %s (同时逃离现有 % 到 %% ,然后使用 vsprintf() ,它以值数组作为格式参数传递:

    $str = str_replace(array('%', '*'), array('%%', '%s'), $str);
    $newstr = vsprintf($str, $arr);
    echo $newstr;
    

    输出:

    abc123efg456hij789
    

    注意,如果数组元素多于星号,那么末尾的多余元素就不会出现在字符串中。如果星号多于数组元素, vSaveTFF() 将发出太少的参数警告并返回 false .

        2
  •  1
  •   mway    15 年前

    你可以一直保持简单 preg_replace() 并利用 $limit 争论,就像这样:

    for($i = 0; $i < count($arr); $i++)
        $str = preg_replace('/\*/', $arr[$i], $str, 1);
    

    但为了实用起见,@boltclock的答案是更好的选择,因为它a)不涉及循环,但更重要的是b)不强制使用正则表达式。