PHP str_replace

问题描述 投票:0回答:8

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

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

我尝试过

str_replace
但不起作用。

谢谢

php str-replace
8个回答
3
投票

您可以使用

preg_replace
limit
参数仅替换一次。

<?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


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

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
参数(我们每次调用只替换一次出现的情况)。


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

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。

演示

alphabet_replace
(更模块化的形式)


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'))); 

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

0
投票

所提出的问题没有提供替换的主列表,因此我假设替换的数量未知。 我将增加替换值,而不是使用有限数组。

请记住,如果

$find
字符串来自不受信任的来源,则应调用
preg_quote()
来转义对正则表达式引擎具有特殊含义的字符。

do-while 循环:(演示)

$input = 'X X X X X X X X';
$find = 'X';
$replace = 'A';

do {
    $input = preg_replace("#$find#", $replace, $input, 1, $count);
    $replace = str_increment($replace);
} while ($count);
echo $input;
// A B C D E F G H

递归函数:(演示)

$input = 'X X X X X X X X';

function incrementalReplace($subject, $find, $replace) {
    $subject = preg_replace("#$find#", $replace, $subject, 1, $count);
    if ($count) {
        $subject = incrementalReplace($subject, $find, str_increment($replace));
    }
    return $subject;
}

echo incrementalReplace($input, 'X', 'A');
// A B C D E F G H

滥用

finally
:(演示

$input = 'X X X X X X X X';
$find = 'X';
$replace = 'A';

echo preg_replace_callback(
         "#$find#",
         function() use (&$replace) {
             try {
                 return $replace;
             } finally {
                 $replace = str_increment($replace);             
             }
         },
         $input
     );
// A B C D E F G H

当然,上述所有技术也可以使用更向后兼容的

++
字符串增量。 (演示)

echo preg_replace_callback(
         "#$find#",
         function() use (&$replace) {
             return $replace++;
         },
         $input
     );
© www.soinside.com 2019 - 2024. All rights reserved.