Reputation: 177
I have the following problem: I want to replace (in php) a special character, but only if it's between two other characters. It tried to find a solution with with preg_replace but it doesn't work.
I want to replace every ; with a : which is between the " The Examples:
$orig_string= 'asbas;"asd;";asd;asdadasd;"asd;adsas"'
result should be:
'asbas;"asd:";asd;asdadasd;"asd:adsas"'
I tried several regexes but without any succes...
Two examples i tried:
$result = preg_replace('(?<=\")(.*)(;)(.*)(?=\")',':', $str);
$result = preg_replace('.*\".*(;).*\"',':', $str);
Can anybody help me?
Thanks a lot
V
Upvotes: 1
Views: 1963
Reputation: 67968
;(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)
Try this.Replace by :
.See demo.
https://www.regex101.com/r/bC8aZ4/16
Upvotes: 1
Reputation: 12389
A simple understandable solution could be the use of preg_replace_callback:
$str = preg_replace_callback('/"[^"]+"/',
function ($m) { return str_replace(";", ":", $m[0]); },
$str);
"[^"]+"
captures the quoted stuff to $m[0]
where ;
is replaced by :
See test at eval.in (link will expire soon)
Upvotes: 1
Reputation: 26667
You need not use look arounds here. It can be written as
("[^";]*);([^"]*")
replace with \1:\2
Test
preg_replace ("/(\"[^\";]*);([^\"]*\")/m", "\\1:\\2", 'asbas;"asd;";asd;asdadasd;"asd;adsas"' );
=> asbas;"asd:";asd;asdadasd;"asd:adsas"
Update:
;(?!(?:"[^"]*"|[^"])*$)
Just replace the matched ;
with :
Upvotes: 4
Reputation: 16122
What about string replace?
str_ireplace(';";', ':";', $orig_string);
asbas;"asd:";asd;asdadasd;"asd;adsas"
Upvotes: -1