Замените один и тот же символ несколько раз другой строкой - PullRequest
0 голосов
/ 03 августа 2010

У меня есть строка с одним и тем же символом несколько раз, и я хочу заменить каждое вхождение этого символа другой строкой из массива. То есть как в готовых высказываниях:

Строка: "SELECT * FROM x WHERE a = ? AND b = ?"
Массив: ['alpha', 'beta']

Результат: "SELECT * FROM x WHERE a = alpha AND b = beta"

Ответы [ 3 ]

8 голосов
/ 03 августа 2010

Если у вас есть контроль над символом замены, используйте sprintf

sprintf('Hello %s, how %s %s?', 'World', 'are', 'you');

или vsprintf:

vsprintf('Hello %s, how %s %s?', array('World', 'are', 'you'));

И даже если вы этого не сделаете:

$str = 'Hello ?, I hope ? ?.';
$str = str_replace('?', '%s', $str);
$str = sprintf($str, "World", "you're", "fine");
3 голосов
/ 03 августа 2010

Попробуйте:

$str = "SELECT * FROM x WHERE a = ? AND b = ?";
$arr = array("alpha", "beta");
foreach ($arr as $s)
    $str = preg_replace("/\?/", $s, $str, 1);
echo $str;

См. здесь .Четвертый параметр ограничивает максимальное количество замен на один вместо неограниченного.

1 голос
/ 03 августа 2010

Без функций регулярных выражений (в качестве бонуса также допускается замена произвольных строк, а не только символов):

function replacement($string, $search, array $replacements) {
    $pos = 0;
    while (($f = strpos($string, $search, $pos)) !== FALSE) {
        $r = array_shift($replacements);
        $string = substr($string, 0, $f) . $r .
            substr($string, $f + strlen($search));
       $pos = $f + strlen($r);
    }
    return $string;
}

Пример:

echo replacement("sf sdf aaasdf sdsaaaaggg", "aa",
    array("alpha", "beta", "gammma"));

дает:

sf sdf alphaasdf sdsbetagammmaggg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...