2010-05-19 60 views
1

我有這樣的事情:正則表達式,除去第二對括號(僅可用時)

$arr[] = 'Seto Hakashima' 
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn)' 
$arr[] = 'Sara (segment "Yvan Attal")' 

我需要刪除第二對括號(僅當有第二對夫婦),和得到這個:

$arr[] = 'Seto Hakashima' 
$arr[] = 'Anna (segment "Yvan Attal")' 
$arr[] = 'Sara (segment "Yvan Attal")' 

謝謝!

回答

1

這工作:

<?php 
$arr[] = 'Seto Hakashima'; 
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn)'; 
$arr[] = 'Sara (segment "Yvan Attal")'; 
$arr[] = 'Anna (segment "Yvan Attal") (as Robin Wright Penn) BONUS text after second group'; 

foreach ($arr as $item) { 
    print preg_replace('/(\([^\)]*\)[^\(]+)\([^\)]*\)\s*/','$1',$item) . "\n"; 
} 

輸出:

瀨Hakashima

安娜(段 「伊萬·阿達勒」)

薩拉(段 「伊萬·阿達勒」)

安娜(段 「伊萬·阿達勒」)獎勵文本第二組後

正如你會發現在最後一個例子中,這個正則表達式足夠具體,它消除了只有se cond組括號,並保持字符串的其餘部分不變。

+0

謝謝..似乎還可以用括號內的括號來工作。 – Jonathan 2010-05-19 16:21:05

1

嘗試

preg_replace('/^([^(]+(?:\([^)]+\))?).*/','$1', $item); 

一些解釋

^   - start of the string 
[^(]+  - match characters before first bracket 
\([^)]+\) - match first bracket 
(?: ...)? - optional 
.*   - eat the rest 
$1   - replace with match string 

或者只是刪除最後一部分

preg_replace('/(?<=\))\s*\(.*$/','', $item); 

(?<=\)) - if there is) before pattern 
(\s*\(.*$ - remove everything after `(` and also zero or more whitespaces before last bracket. 
+0

不會刪除「(如Robin Wright Penn)」 – 2010-05-19 16:15:23

+0

括號內有圓括號時出現問題。 – Jonathan 2010-05-19 16:20:36

+0

是的,圓括號內的括號不支持這一點。 – YOU 2010-05-19 16:22:46