Как получить все между скобками в PHP? - PullRequest
4 голосов
/ 08 сентября 2010
Array(
[1] => put returns (between) paragraphs
[2] => (for) linebreak (add) 2 spaces at end
[3] => indent code by 4 (spaces!)
[4] => to make links
)

Хотите получить текст в скобках (для каждого значения):

  1. принять только первый матч
  2. удалить это совпадение из значения
  3. записать все совпадения в новый массив

После того, как функциональные массивы должны выглядеть следующим образом:

Array(
[1] => put returns paragraphs
[2] => linebreak (add) 2 spaces at end
[3] => indent code by 4
[4] => to make links
)
Array(
[1] => between
[2] => for
[3] => spaces!
[4] => 
)

Какое решение?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Я бы использовал регулярное выражение /\((\([^()]*\)|[^()]*)\)/ (соответствует одной или двум парам скобок) вместе с 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.Остальные участники затем снова собираются вместе.

2 голосов
/ 08 сентября 2010

Если вы имели в виду (between), а не ((between))

$arr = array(
                0 => 'put returns (between) paragraphs',
                1 => '(for) linebreak (add) 2 spaces at end',
                2 => 'indent code by 4 (spaces!)',
                3 => 'to make links');
var_dump($arr);

$new_arr = array();
foreach($arr as $key => &$str) {
        if(preg_match('/(\(.*?\))/',$str,$m)) {
                $new_arr[] = $m[1]; 
                $str = preg_replace('/\(.*?\)/','',$str,1);
        }   
        else {
                $new_arr[] = ''; 
        }   
}
var_dump($arr);
var_dump($new_arr);

Рабочая ссылка

...