删除括号之间所有出现的文本,包括它们自己

Remove all occurrences of text between brackets including themselves

我需要删除括号之间出现的所有文本,包括行本身。

我使用一段值得的代码,直到它出现不止一个元素

$array[] = '[2016-12-26 16:48:57 +0100] pkgacct working dir : /cprsync_back3/tamainut';
$array[] = '[2016-12-26 16:48:57 +0100] Copying SSL certificates, CSRs, and keys...[2016-12-26 16:48:57 +0100] Done'

foreach ($array as &$line) {
    $line = preg_replace("/\[[^)]+\]/","",$line);
    echo $line.PHP_EOL;
}

这适用于第一行,但不适用于第二行

pkgacct working dir : /cprsync_back3/tamainut
Done

只需要提取什么 [..] 但要保留这个 [..] ?

看看循环;您的正则表达式也需要修复(注意我添加了 ? 量词)。

$array[
    '[2016-12-26 16:48:57 +0100] pkgacct working dir : /cprsync_back3/tamainut',
    '[2016-12-26 16:48:57 +0100] Copying SSL certificates, CSRs, and keys...[2016-12-26 16:48:57 +0100] Done'
];

foreach ($array as $key => $line) {
    $array[$key] = preg_replace('/\[(.*?)\]/', "", $line);
}

echo '<pre>';
print_r($array);

正则表达式:

\[[^][]*(?(?=\[)(?R))[^][]*\]

Live demo

解释:

\[              # Match opening bracket
[^][]*          # Match anything but `[` & `]` characters
(?(?=\[)(?R))   # If previous match ends before `[` repeat whole pattern
[^][]*          # //
\]              # Match closing bracket

这个正则表达式应该也适用于 嵌套括号

代码片段:

preg_replace("@\[[^][]*(?(?=\[)(?R))[^][]*\]@", "", $line);

只需将字符中的括号替换为括号 class:

$line = preg_replace("/\[[^\]]+\]/","",$line);
//                   here __^