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

0

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

$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() соответствовал слову правильно/точно.

Теги:
str-replace

3 ответа

2
Лучший ответ

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

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

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

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

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

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

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

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

  • 0
    Спасибо за спасение моей жизни :)
  • 0
    @ НиколаВелев Добро пожаловать! (Кстати: вы можете принять ответ, который помог вам больше всего и решил вашу проблему! ( Meta.stackexchange.com/q/5234 ). Вы также можете сделать это для всех остальных вопросов, если у вас есть такой ответ)
Показать ещё 1 комментарий
1

Попробуйте заменить сначала для :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

Попробуй

  • 0
    У вас правильные мысли, но вы использовали неправильную функцию :) Здесь вы почти выполняете реализацию strtr() , но вы не можете сделать это с помощью str_replace() . Здесь вы также начинаете с самых длинных замен байтов, но вы все равно заменили бы предыдущие замены, что вы не сделали бы с strtr() . (Например, если вы замените:: :y2 на :y вы получите aa , но с strtr() вы получите a :y )
  • 0
    Да, хорошо, я не знал эту функцию, я всегда использовал str_replace для выполнения этой книги. Рад, что узнал что-то новое
0
: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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню