У меня есть строка $ 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; ?>
Вы можете использовать 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