Удалить текст за пределами скобок

т.е.

$text = 'remove this text (keep this text and 123)'; echo preg_replace('', '', $text); 

Он должен выводить:

 (keep this text and 123) 

Возьмите что-нибудь, найденное в скобках, поместите его в группу захвата и сохраните это только так:

 echo preg_replace('/^.*(\(.*\)).*$/', '$1', $text); 

Это сделает это: (и работает также с вложенным () )

 $re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/'; $text = preg_replace($re, '$1', $text); 

Вот несколько тестовых случаев:

 Input: Non-nested case: 'remove1 (keep1) remove2 (keep2) remove3' Nested case: 'remove1 ((keep1) keep2 (keep3)) remove2' Output: Non-nested case: '(keep1)(keep2)' Nested case: '(keep1) keep2 (keep3)' данные Input: Non-nested case: 'remove1 (keep1) remove2 (keep2) remove3' Nested case: 'remove1 ((keep1) keep2 (keep3)) remove2' Output: Non-nested case: '(keep1)(keep2)' Nested case: '(keep1) keep2 (keep3)' 

Здесь путь «не preg_replace»:

 <? $text = 'remove this text (keep this text)' ; $start = strpos($text,"(") ; $end = strpos($text,")") ; echo substr($text,$start+1,$end-$start-1) ; // without brackets echo substr($text,$start,$end-$start+1) ; // brackets included ?> 

Заметка:
– Это извлекает только первую пару скобок.
– Замените strpos () на strrpos (), чтобы получить последнюю пару скобок.
– Вложенные скобки вызывают проблемы.