2016-12-26 92 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 __^ 
相關問題