PHP str_replace - PullRequest
       18

PHP str_replace

1 голос
/ 12 сентября 2011

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

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

Я пробовал с str_replace, но это не работает.

Спасибо

Ответы [ 7 ]

3 голосов
/ 12 сентября 2011

Вы можете использовать аргумент 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 голосов
/ 12 сентября 2011

Вы можете использовать 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 голос
/ 12 сентября 2011

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

$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);
1 голос
/ 12 сентября 2011
$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);

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

0 голосов
/ 13 сентября 2011

В других ответах происходит много циклов, вот альтернатива.

$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 голосов
/ 13 сентября 2011

Давайте попробуем тоже, просто ради этого;)

$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 голосов
/ 12 сентября 2011

Еще одно решение (больше для динамического числа 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, поэтому "FAUXPAS X "заменяет только последний X.

demo

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

...