Заменить все пробелы в строке внутри фигурных скобок

Мне нужно заменить все пробелы в строках внутри фигурных скобок (включая префикс). Пример:

Откуда: 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 }?

anubhava 30.12.2018 12:07

То же, что и в конце: x {Test test test} => x {Test_test_test}

Jonas 30.12.2018 12:12

Легче сделать с preg_replace_callback: preg_replace_callback('~\bx{[^{}]+}~', function ($m) { return preg_replace('~(?<!{)\s++(?!})~', '_', $m[0]); }, $str)

Wiktor Stribiżew 30.12.2018 12:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого вы можете использовать регулярное выражение баз \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

Детали RegEx:

  • \G утверждает позицию в конце предыдущего совпадения или в начале строки для первого совпадения.
  • (?:x{|(?<!^)\G): соответствует x{ или концу предыдущего матча.
  • \K: сбросить информацию о текущем матче
  • \s+: соответствие 1+ пробелов
  • (?!}): Утверждаю, что впереди у нас нет }

Другие вопросы по теме