我正在尝试从数据中的括号内的内容中删除换行符和制表符,如下所示:
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
结合使用(因此,只需一次正则表达式即可):
[\t\n]+(?=[^][]*(?:(\[(?:[^][]++|(?1))*])[^][]*)*])
请参阅regex demo 。详情:
[\t\n]+
- 一个或多个制表符或换行符(如果需要匹配任何空格,请使用\s
,如果需要处理 Unicode 文本,还可以添加u
修饰符标志)(?=[^][]*(?:(\[(?:[^][]++|(?1))*])[^][]*)*])
- 正向前瞻,要求其模式立即匹配到当前位置的右侧:[^][]*
- 除[
和]
之外的零个或多个字符(?:(\[(?:[^][]++|(?1))*])[^][]*)*
- 零次或多次出现(\[(?:[^][]++|(?1))*])
- 第 1 组(技术,递归工作所必需):a[
,然后是成对嵌套[
和]
之间的任何子字符串,然后是]
[^][]*
- 除[
和]
之外的零个或多个字符
]
-]
字符。
参见PHP demo :
$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 - 正则表达式匹配括号之间的换行符和制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65275195/