我有字符串$ var,我需要替换一些文本。第一个“X”需要替换为“A”,第二个“X”需要替换为B等等,这是一个例子:
<?php
$var = "X X X X"; // input
...
echo $var //the result: "A B C D"
?>
我尝试使用str_replace
,但这不起作用。
由于
答案 0 :(得分: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;
?>
答案 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.
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