Регулярное выражение для соответствия разрывам строк и табуляциям между скобками

Я пытаюсь удалить разрывы строк и вкладки из содержимого, которое находится внутри скобок, из таких данных:

settings:a [
    a:[
        a:a
        b:b
    ]
    b:[
        a:a
        b:b
    ]
]

settings:b [
    a:[
        a:a
        b:b
    ]
]

Так становится:

settings:a [ a:[ a:a b:b ] b:[ a:a b:b ] ] 
settings:b [ a:[ a:a b:b ] ]

Регулярное выражение, которое я использую \n(?=[^\[\]]*\]), работает до некоторой степени, но я не получаю результат, как указано выше. Вы можете помочь?

Пример регулярного выражения

хотя это работает с регулярным выражением, вам следует подумать о том, чтобы сделать это с php. Если вы посмотрите на регулярное выражение через несколько месяцев... или еще хуже - если коллега посмотрит на регулярное выражение через несколько месяцев, он не поймет, что вы там сделали

Sindhara 13.12.2020 13:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
1
445
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать это рекурсивное регулярное выражение в preg_replace_callback:

$s = 'settings:a [
    a:[
        a:a
        b:b
    ]
    b:[
        a:a
        b:b
    ]
]';

echo preg_replace_callback('/\[(?:([^][]*)|(?R))*\]/', function ($m) {
      return preg_replace('/\s+/', ' ', $m[0]); }, $s) . "\n";

Выход:

settings:a [ a:[ a:a b:b ] b:[ a:a b:b ] ]

Демонстрация регулярных выражений

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

Вы можете использовать следующее регулярное выражение с preg_replace (так что подойдет один проход регулярного выражения):

[\t\n]+(?=[^][]*(?:(\[(?:[^][]++|(?1))*])[^][]*)*])

Посмотрите демонстрацию регулярного выражения . Подробности:

  • [\t\n]+ — один или несколько символов табуляции или новой строки (используйте \s, если вам нужно сопоставить любой пробел, а также добавьте флаг модификатора u, если вам нужно обрабатывать тексты Unicode)
  • (?=[^][]*(?:(\[(?:[^][]++|(?1))*])[^][]*)*]) — положительный прогноз, который требует, чтобы его шаблоны совпадали сразу справа от текущего местоположения:
    • [^][]* - ноль или более символов, кроме [ и ]
    • (?:(\[(?:[^][]++|(?1))*])[^][]*)* - ноль или более вхождений
      • (\[(?:[^][]++|(?1))*]) - Группа 1 (техническая, необходимая для работы рекурсии): [, затем любая подстрока между парными вложенными [ и ] и затем ]
      • [^][]* - ноль или более символов, кроме [ и ]
    • ] - символ ].

См. демоверсию PHP:

$re = '/[\t\n]+(?=[^][]*(?:(\[(?:[^][]++|(?1))*])[^][]*)*])/';
$str = "settings:a [\n  a:[\n       a:a\n       b:b\n   ]\n b:[\n       a:a\n       b:b\n   ]\n]\n\nsettings:b [\n  a:[\n   \n\na:a\n       b:b\n   ]\n]";
echo preg_replace($re, ' ', $str);
// => settings:a [ a:[ a:a b:b ] b:[ a:a b:b ] ]
//    settings:b [ a:[ a:a b:b ] ]

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