т.е.
$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 (), чтобы получить последнюю пару скобок.
– Вложенные скобки вызывают проблемы.