Многократная замена (возможно, preg_replace) одной строки на массив - PullRequest
1 голос
/ 29 января 2010

Мне нужно заменить несколько экземпляров определенной строки (вопросительный знак) на строки из массива. например если строка, которую я хочу заменить, появляется 3 раза, а мой массив имеет длину 3, первая будет заменена первым элементом массива, вторая - вторым и т. д.

Вы можете заметить, что это очень похоже на работу подготовленных операторов в mysqli.

Вот пример:

$myArray = array(
    [0] => 'yellow',
    [1] => 'green',
    [2] => 'red'
);

$myString = 'banana is ?, apple is ?, tomato is ?';

$newString = someFunction($myString,$myArray);

echo $newString;

Это вернет

banana is yellow, apple is green, tomato is red

Может кто-нибудь предложить способ сделать это с помощью PHP 5.2.

Ответы [ 2 ]

5 голосов
/ 29 января 2010

почему бы не использовать

$retString = vsprintf('banana is %s, apple is %s, tomato is %s', $myArray);  
return $retString;
2 голосов
/ 29 января 2010

Это немного уродливо в PHP 5.2, потому что вы должны использовать глобальные переменные для передачи информации между обратными вызовами, но в противном случае это очень гибко. Используйте preg_replace_callback():

preg_replace_callback('!\?!', 'rep_array', $myString);

$i = 0;

function rep_array($matches) {
  global $myArray;
  return $myArray[$i++];
}

Вы должны были бы обслуживать больше ? s, чем записей массива, а также сбрасывать счетчик при каждом вызове.

Адам прав в том, что sprintf() немного чище, но вы не всегда управляете строкой ввода. preg_replace_callback может удовлетворить гораздо более широкий круг обстоятельств.

...