Я бы использовал регулярное выражение /\((\([^()]*\)|[^()]*)\)/
(соответствует одной или двум парам скобок) вместе с preg_split
:
$matches = array();
foreach ($arr as &$value) {
$parts = preg_split('/\((\([^()]*\)|[^()]*)\)/', $value, 2, PREG_SPLIT_DELIM_CAPTURE);
if (count($parts) > 1) {
$matches[] = current(array_splice($parts, 1, 1));
$value = implode('', $parts);
}
}
Использование preg_split
с PREG_SPLIT_DELIM_CAPTURE установленный флаг будет содержать совпавшие разделители в массиве результатов.Итак, совпадение найдено, как минимум три части.В этом случае второй член - тот, кого мы ищем.Этот член удаляется с помощью array_splice
, который также возвращает массив удаленных членов.Чтобы получить удаленный элемент, current
используется для возвращаемого значения array_splice
.Остальные участники затем снова собираются вместе.