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