Reputation: 23
I'm trying to replace parts of my string. But I met a problem when my search string start with same character:
$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
I need my str_replace()
to match the word correctly/exactly.
Upvotes: 0
Views: 143
Reputation: 59701
Besides that you should define your array first before you use it, this should work for you:
$str = strtr($string, $my_array);
Your problem is that str_replace()
goes through the entire string and replaces everything it can, you can also see this in the manual.
And a quote from there:
Because str_replace() replaces left to right, it might replace a previously inserted value when doing multiple replacements. See also the examples in this document.
So for this I used strtr()
here, because it tries to match the longest byte in the search first.
You can also read this in the manual and a quote from there:
If given two arguments, the second should be an array in the form array('from' => 'to', ...). The return value is a string where all the occurrences of the array keys have been replaced by the corresponding values. The longest keys will be tried first. Once a substring has been replaced, its new value will not be searched again.
Upvotes: 2
Reputation: 67988
:y\b
Use this to replace only :y
and not :y2
.See demo.
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);
Similarly for :y2
use :y2\b
.
Upvotes: 0