php - 正则表达式匹配括号之间的换行符和制表符

标签 php regex preg-replace

我正在尝试从数据中的括号内的内容中删除换行符和制表符,如下所示:

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(?=[^\[\]]*\]) 在某种程度上有效,但我没有得到上面那样的输出。你能帮忙吗?

Regex Example

最佳答案

您可以将以下正则表达式与 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/

相关文章:

php - 数字列表,同时删除除数字之外的所有内容

php - 正则表达式编译错误

php - 选定时间 + 1440 分钟

php - 选择菜单的联系表格 7 水印

php - 如何拆分一个空格分隔的文件?

javascript - 将 Google Analytics UTM 跟踪添加到 Google 表格中的单元格

python - 避免正则表达式 [python]

php - 使用 preg_replace 无法正常工作

php - Symfony 在哪里初始化 Doctrine 的默认事务隔离级别?

php - PHP检查多个文本框并插入数据错误