PHP str_replace

У меня есть строка $ var, в которой мне нужно заменить некоторый текст. Первый «X» нужно заменить на «A», второй «X» нужно заменить на B и т. Д., Вот пример:

<?php $var = "XXXX"; // input ... echo $var //the result: "ABCD" ?> 

Я пытался с str_replace но это не работает.

благодаря

Вы можете использовать preg_replace для limit только один раз.

 <?php $var = 'XXX 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

Вы можете использовать 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 = 'XXX 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); 

Этот использует параметр $limit preg_replace (мы заменяем только одно вхождение на вызов).

Без использования регулярного выражения

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

Еще одно решение (больше для динамического числа Xs):

 <?php $foo = 'XXXXX 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 в шаблон, чтобы заменить только Xs, которые являются свободно стоящими, поэтому «FAUX PAS X» заменяет только последний X.

демонстрация

alphabet_replace (более модульная форма)

Давайте тоже сделаем снимок, просто для этого;)

 $input = "XXXX"; 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 = 'XXXXXX X'; $replace = array('A', 'B', 'C', 'D'); $var = preg_replace(array_fill(0, count($replace), '/X/'), $replace, $var, 1); echo $var; // ABCDXXX