PHP str_replace

时间:2011-09-12 15:29:06

标签: php str-replace

我有字符串$ var,我需要替换一些文本。第一个“X”需要替换为“A”,第二个“X”需要替换为B等等,这是一个例子:

<?php
$var = "X X X X"; // input
...
echo $var //the result: "A B C D"
?>

我尝试使用str_replace,但这不起作用。

由于

7 个答案:

答案 0 :(得分:3)

您可以使用preg_replacelimit参数仅替换一次。

<?php
    $var = 'X X X X';
    $replace = array('A', 'B', 'C', 'D');
    foreach($replace as $r)
        $var = preg_replace('/X/', $r, $var, 1);
    echo $var;
?>

http://codepad.viper-7.com/ra9ulA

答案 1 :(得分:2)

您可以使用preg_replace_callback()

// as many as you think you'll need, maximum.
// this can be programmatically generated, if need be
$replacements = array('A', 'B', 'C', 'D', 'E', 'F', 'G'); // and so on    

function get_replace_value($matches) {
    global $replacements;
    return array_shift($replacements);
}

$var = preg_replace_callback("/" + preg_quote($needle) + "/",
    "get_replace_value", $var);

答案 2 :(得分:1)

$var = 'X X X X';
$replacements = array('A', 'B', 'C', 'D');

$var = preg_replace_callback('/X/', function() use (&$replacements) {
    return array_shift($replacements);
}, $var);

其他解决方案:

$var = preg_replace('/X/', 'A', $var, 1);
$var = preg_replace('/X/', 'B', $var, 1);
$var = preg_replace('/X/', 'C', $var, 1);
$var = preg_replace('/X/', 'D', $var, 1);

这个使用preg_replace的$limit参数(我们每次调用只替换一次)。

答案 3 :(得分:1)

不使用正则表达式

$arr = explode('X', 'X X X X');
$rep = array('A','B','C','D');
foreach ($arr as $idx=>$val)
{
  $arr[$idx] = $val.$rep[$idx];
}
echo implode($arr);

答案 4 :(得分:0)

还有一个解决方案(对于动态数量的X更多):

<?php

  $foo = 'X X X X X X';

  $Xs = preg_match_all('/\bX\b/',$foo,$_); if ($Xs === false) $Xs = 0;
  $alphabet = range('A', chr(64 + $Xs));
  foreach ($alphabet as $letter){
    $foo = preg_replace('/\bX\b/', $letter, $foo, 1);
  }

  echo $foo;

我还将\b添加到模式中以仅替换独立的X,因此“FAUX PAS X”仅替换最后的X.

demo

alphabet_replace(更多模块化形式)

答案 5 :(得分:0)

让我们试一试,只是为了它的哎呀;)

$input = "X X X X";

function replace($input, array $replacements)
{
    $replacer = function(array &$i, array &$r, &$o) use(&$replacer) {
        if (count($i) === 0 || count($r) === 0) return;

        $i_cur = array_shift($i);

        if (ctype_space($i_cur)) $o .= $i_cur;
        else $o .= array_shift($r);

        $replacer($i, $r, $o);
    };

    $replacer(str_split($input), $replacements, $output);

    return $output;
}

var_dump(replace($input, range('A', 'Z'))); 

答案 6 :(得分:0)

在其他答案中发生了很多循环,这里是另一种选择。

$var = 'X X X X X X X';
$replace = array('A', 'B', 'C', 'D');
$var = preg_replace(array_fill(0, count($replace), '/X/'), $replace, $var, 1);
echo $var; // A B C D X X X