Попытка заменить части строки начинаются с одинаковых символов поиска

Я пытаюсь заменить части моей строки. Но я столкнулся с проблемой, когда моя строка поиска начинается с того же символа:

$string = "Good one :y. Keep going :y2"; $str = str_replace(array_keys($my_array), array_values($my_array), $string); $my_array= array(":y" => "a", ":y2" => "b"); 

Ouput:

 Good one a. Keep going a2 

Мне нужно, чтобы str_replace() соответствовал слову правильно / точно.

Solutions Collecting From Web of "Попытка заменить части строки начинаются с одинаковых символов поиска"

Кроме того, прежде чем использовать его, вы должны определить свой массив, это должно сработать для вас:

 $str = strtr($string, $my_array); 

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

И цитата оттуда:

Поскольку str_replace () заменяет слева направо , он может заменить ранее вставленное значение при выполнении нескольких замен . См. Также примеры в этом документе.

Поэтому для этого я использовал strtr() здесь, потому что он сначала пытается сопоставить самый длинный байт в поиске.

Вы также можете прочитать это в руководстве и цитату оттуда:

Если заданы два аргумента, второй должен быть массивом в массиве форм ('from' => 'to', …). Возвращаемое значение – это строка, в которой все вхождения ключей массива были заменены соответствующими значениями. Сначала будут проверены самые длинные ключи. Как только подстрока будет заменена, ее новое значение больше не будет искать.

Попробуйте заменить сначала для :y2 а затем для :y

 $string = "Good one :y. Keep going :y2"; $my_array= array(":y2" => "b", ":y" => "a"); $str = str_replace(array_keys($my_array), array_values($my_array), $string); 

выходы

 Good one a. Keep going b 

Попробуй

 :y\b 

Используйте это для замены только :y а не :y2 См. Демонстрацию.

https://regex101.com/r/sJ9gM7/9

 $re = "":y\\b"m"; $str = "Good one :y. Keep going :y2\n"; $subst = "a"; $result = preg_replace($re, $subst, $str); 

Аналогично для :y2 use :y2\b .