我有字符串 $var,我需要在其中替换一些文本。第一个“X”需要替换为“A”,第二个“X”需要替换为B等等,这是一个例子:
<?php
$var = "X X X X"; // input
...
echo $var //the result: "A B C D"
?>
我尝试过
str_replace
但不起作用。
谢谢
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;
?>
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);
$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
参数(我们每次调用只替换一次出现的情况)。
不使用正则表达式
$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);
还有一个解决方案(更多用于动态数量的 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
(更模块化的形式)
让我们也尝试一下,只是为了好玩;)
$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')));
其他答案中发生了很多循环,这里有一个替代方案。
$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
所提出的问题没有提供替换的主列表,因此我假设替换的数量未知。 我将增加替换值,而不是使用有限数组。
请记住,如果
$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
);