Я пытаюсь удалить разрывы строк и вкладки из содержимого, которое находится внутри скобок, из таких данных:
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(?=[^\[\]]*\]), работает до некоторой степени, но я не получаю результат, как указано выше. Вы можете помочь?






Вы можете использовать это рекурсивное регулярное выражение в 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 ] ]
хотя это работает с регулярным выражением, вам следует подумать о том, чтобы сделать это с php. Если вы посмотрите на регулярное выражение через несколько месяцев... или еще хуже - если коллега посмотрит на регулярное выражение через несколько месяцев, он не поймет, что вы там сделали