2016-12-26 91 views
1

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

我用了一段代码,这是值得,直到它出现一个以上的元素

$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 

什么只需提取[..]但保存这个[..]

+0

节约时,有字符串中是否匹配?也许'^(\ [([^)] +?)\])。*?\ 1(* SKIP)(* FAIL)|^\ [[^)] +?\]。 – chris85

+0

Btw ['preg_replace'](http://php.net/manual/en/function.preg-replace.php)* subject *也可以是一个数组[如本演示中所示](https://eval.in/704883)。 –

回答

1

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

$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); 
+0

答案应该有解释。这是没有道理的,因为你只是回应原来的线.. – chris85

+0

你是对的,我也需要修复正则表达式。 –

+0

非常感谢... @GeorgyIvanov工作正常 – abkrim

1

正则表达式:

\[[^][]*(?(?=\[)(?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); 
+0

应该工作[但似乎没有](https://www.regex101.com/r/HYZUVI/1)[如此] [https: //www.regex101.com/r/HYZUVI/2)。 –

+1

好点。由于没有涉及量词,因此它与括号内的'] ... ['之间的内容不匹配。说我必须应用它[**'[[^] [] * +(?:(?R)?[^] [] *)* +]'**](https://www.regex101 .com/r/sTlH1A/3)(也缩短了*递归的量化条件语句*)。这是一个线性正则表达式,您可以将其与您的建议进行比较。 @bobblebubble – revo

1

只需通过支架在字符类替换括号:

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