php preg_replace regex заменить строку между двумя строками

У меня есть следующая проблема: я хочу заменитьphp) особым символом, но только если он находится между двумя другими символами. Он пытался найти решение с помощью preg_replace, но он не работает.

Я хочу заменить все; с a: который находится между «примерами:

$orig_string= 'asbas;"asd;";asd;asdadasd;"asd;adsas"' 

результатом должно быть:

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

Я пробовал несколько регулярных выражений, но без каких-либо успехов …

Два примера, которые я пробовал:

 $result = preg_replace('(?<=\")(.*)(;)(.*)(?=\")',':', $str); $result = preg_replace('.*\".*(;).*\"',':', $str); 

Кто-нибудь может мне помочь?

большое спасибо

В

Здесь вам не нужно использовать внешний вид. Его можно записать как

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

замените на \1:\2

Демо-версия Regex

Контрольная работа

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

Обновить:

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

Просто замените соответствующий ; с :

DEMO

Простым понятным решением может быть использование preg_replace_callback :

 $str = preg_replace_callback('/"[^"]+"/', function ($m) { return str_replace(";", ":", $m[0]); }, $str); 

"[^"]+" захватывает цитируемый материал до $m[0] где: заменяется на :

См. Тест на eval.in (ссылка скоро истечет)

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

Попробуйте это. Замените :

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

Как насчет замены строки?

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

asbas; "ASD:"; ASD; asdadasd; "ASD; adsas"