我正在尝试从这样的数据中删除括号内内容的换行符和制表符:
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演示。细节:
[\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 ] ]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句