заменить одинаковые символы разными строками - PullRequest
5 голосов
/ 21 октября 2010

Предполагая, что у меня есть строка

$str = "abc*efg*hij*";

и массив

$arr = array("123","456","789");

Теперь я хочу заменить * в $str на элементы в $arrв соответствии с позициями. Первый * заменен на $arr[0], второй заменен на $arr[1] и т. д. Я проверяю функцию str_replace , хотя он принимает массивы в качестве параметров, но я обнаружил, что он не работаетИ я не могу просто использовать

$newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}"

, потому что реальная $str может быть довольно длинной строкой с большим количеством *. Есть хорошие идеи? Спасибо.

Ответы [ 2 ]

12 голосов
/ 21 октября 2010

Если * является вашим единственным символом формата, попробуйте преобразовать * в %s (также экранировать существующие % в %%), а затем используйте vsprintf(), что занимает массив значений для передачи в качестве параметров формата:

$str = str_replace(array('%', '*'), array('%%', '%s'), $str);
$newstr = vsprintf($str, $arr);
echo $newstr;

Выход:

abc123efg456hij789

Обратите внимание, что если у вас больше элементов массива, чем звездочек, дополнительные элементы в конце просто не появятся в строке. Если у вас больше звездочек, чем элементов массива, vsprintf() выдаст предупреждение «слишком мало аргументов» и вернет false.

1 голос
/ 21 октября 2010

Вы всегда можете просто сделать это просто с помощью preg_replace() и использовать аргумент $limit, например:

for($i = 0; $i < count($arr); $i++)
    $str = preg_replace('/\*/', $arr[$i], $str, 1);

но для практичности ответ @ BoltClock является лучшим выбором, поскольку а) не включает цикл, но, что более важно, б) не вынужден использовать регулярное выражение.

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