Хорошо, у меня есть str_replace и что я хочу сделать, это принимать значения из массива и брать следующий фрагмент, чтобы заменить слово «собака». Поэтому в основном я хочу читать строку $:
«Утка съела кошку, а свинья съела шимпанзе»
<?php $string = 'The dog ate the cat and the dog ate the chimp'; $array = array('duck','pig'); for($i=0;$i<count($array);$i++) { $string = str_replace("dog",$array[$i],$string); } echo $string; ?>
Этот код просто возвращает:
«Утка съела кошку, а утка съела шимпанзе»
Я пробовал несколько вещей, но ничего не работает. У кого-нибудь есть идеи?
Изменить: Извините за ошибочный ответ раньше. Это будет сделано. Нет str_replace
, нет preg_replace
, просто сырой, быстрый поиск строк и сращивание:
<?php $string = 'The dog ate the cat and the dog ate the chimp'; $array = array('duck', 'pig'); $count = count($array); $search = 'dog'; $searchlen = strlen($search); $newstring = ''; $offset = 0; for($i = 0; $i < $count; $i++) { if (($pos = strpos($string, $search, $offset)) !== false){ $newstring .= substr($string, $offset, $pos-$offset) . $array[$i]; $offset = $pos + $searchlen; } } $newstring .= substr($string, $offset); echo $newstring; ?>
ps В этом примере не большое дело, но вы должны держать count()
вне своего цикла. С ним, где у вас было это, он запускается на каждой итерации и медленнее, чем просто называть его один раз заранее.
<?php $string = 'The dog ate the cat and the dog ate the chimp'; $array = array('duck', 'pig'); $count = count($array); for($i = 0; $i < $count; $i++) { $string = preg_replace('/dog/', $array[$i], $string, 1); } echo $string; ?>
Утка съела кошку, и свинья съела шимпанзе
После первой итерации вашего цикла $ string будет заменена обе вхождения собаки утиной, и следующие итерации ничего не сделают.
Я не могу придумать более элегантный способ решения этого вопроса, и я надеюсь, что есть что-то более простое:
<?php $search = 'The dog ate the cat and the dog ate the chimp'; $replacements = array('duck','pig'); $matchCount = 0; $replace = 'dog'; while(false !== strpos($search, $replace)) { $replacement = $replacements[$matchCount % count($replacements)]; $search = preg_replace('/('.$replace.')/', $replacement, $search, 1); $matchCount++; } echo $search;
еще один вариант
$str = 'The dog ate the cat and the dog ate the chimp'; $rep = array('duck','pig'); echo preg_replace('/dog/e', 'array_shift($rep)', $str);
Использование substr_replace()
;
<?php function str_replace_once($needle, $replace, $subject) { $pos = strpos($subject, $needle); if ($pos !== false) $subject = substr_replace($subject, $replace, $pos, strlen($needle)); return $subject; } $subject = 'The dog ate the cat and the dog ate the chimp'; $subject = str_replace_once('dog', 'duck', $subject); $subject = str_replace_once('dog', 'pig', $subject); echo $subject; ?>