Мне нужно заменить все пробелы в строках внутри фигурных скобок (включая префикс). Пример:
Откуда: x{Test test} test test x{Test test test } test {Test test}
Кому x{Test_test} test test x{Test_test_test } test {Test test}
(применимо только к x{} - когда фигурные скобки включают префикс x)
Я могу сделать это с помощью lookhead / lookbehind, но это не работает в PHP / PCRE
`(?<=x\{[^\{\}]+)\s+(?=[^\{\}]+\})`
Проблема в том, как сделать совместимость PHP / PCRE с функцией preg_replace?
То же, что и в конце: x {Test test test} => x {Test_test_test}
Легче сделать с preg_replace_callback: preg_replace_callback('~\bx{[^{}]+}~', function ($m) { return preg_replace('~(?<!{)\s++(?!})~', '_', $m[0]); }, $str)






Для этого вы можете использовать регулярное выражение баз \G:
$str = 'x{Test test} test test x{Test test test } test {Test test}';
$repl = preg_replace('/(?:x{|(?<!^)\G)[^\s}]*\K\s+(?!})/', '_', $str);
//=> x{Test_test} test test x{Test_test_test } test {Test test}
Детали RegEx:
\G утверждает позицию в конце предыдущего совпадения или в начале строки для первого совпадения.(?:x{|(?<!^)\G): соответствует x{ или концу предыдущего матча.\K: сбросить информацию о текущем матче\s+: соответствие 1+ пробелов(?!}): Утверждаю, что впереди у нас нет }
А как насчет места перед
}вx{Test_test_test }?