Der_V
Der_V

Reputation: 177

php preg_replace regex replace string between two string

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

Answers (4)

vks
vks

Reputation: 67968

;(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)

Try this.Replace by :.See demo.

https://www.regex101.com/r/bC8aZ4/16

Upvotes: 1

Jonny 5
Jonny 5

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

nu11p01n73R
nu11p01n73R

Reputation: 26667

You need not use look arounds here. It can be written as

("[^";]*);([^"]*")

replace with \1:\2

Regex Demo

Test

preg_replace ("/(\"[^\";]*);([^\"]*\")/m", "\\1:\\2", 'asbas;"asd;";asd;asdadasd;"asd;adsas"' );
=> asbas;"asd:";asd;asdadasd;"asd:adsas"

Update:

;(?!(?:"[^"]*"|[^"])*$)

Just replace the matched ; with :

DEMO

Upvotes: 4

Junius L
Junius L

Reputation: 16122

What about string replace?

str_ireplace(';";', ':";', $orig_string);

asbas;"asd:";asd;asdadasd;"asd;adsas"

Upvotes: -1

Related Questions