Как вырезать текст между скобочками в php

192
03 апреля 2019, 18:50

Есть текст. В нем есть скобки. Как вырезать текст в этих скобках и поместить его в в массив? Т.е. каждое слово между скобок ( и ) должно стать элементом массива. И если мы добавим еще скобки, то текст между ними должен тоже автоматически вырезаться в массив. Регулярки использовать нельзя. Нужно как-то циклом наверное... Но не получается. Заранее благодарю за любую подсказку. На выходе результатом должен быть не один массив, а из каждого отрезка текста между скобочками чтобы создавался отдельный массив с элементами из слов. Например:

Array(2){
[0]=>'Уважаемые' 
[1]=>'клиенты'}

Вот текст:

$y='(Уважаемые клиенты)! У некоторых пользователей могут быть трудности с отображением полисов ДМС (в личном кабинете). Спешим вас заверить, что все ваши полисы - действительны (и на их актуальность это не повлияет). В настоящее время мы работаем над проблемой отображения. (Приносим извинения за доставленные неудобства).';

Answer 1
$text='(Уважаемые клиенты)! У некоторых пользователей могут быть трудности с отображением полисов ДМС (в личном кабинете). Спешим вас заверить, что все ваши полисы - действительны (и на их актуальность это не повлияет). В настоящее время мы работаем над проблемой отображения. (Приносим извинения за доставленные неудобства).';
$array = [];
$start = null; $end = null;
foreach(range(0, strlen($text)) as $index){
    $symbol = mb_substr($text, $index, 1, 'UTF-8');
    if($symbol == "("){
        $start = $index+1;
    }
    if($symbol == ")"){
      $end = $index;
      $str = mb_substr($text, $start, ($end - $start), "UTF-8");
      array_push($array, explode(" ", $str));
    }
}
var_dump($array);

Результат:

array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(18) "Уважаемые"
    [1]=>
    string(14) "клиенты"
  }
  [1]=>
  array(3) {
    [0]=>
    string(2) "в"
    [1]=>
    string(12) "личном"
    [2]=>
    string(16) "кабинете"
  }
  [2]=>
  array(7) {
    [0]=>
    string(2) "и"
    [1]=>
    string(4) "на"
    [2]=>
    string(4) "их"
    [3]=>
    string(24) "актуальность"
    [4]=>
    string(6) "это"
    [5]=>
    string(4) "не"
    [6]=>
    string(16) "повлияет"
  }
  [3]=>
  array(5) {
    [0]=>
    string(16) "Приносим"
    [1]=>
    string(18) "извинения"
    [2]=>
    string(4) "за"
    [3]=>
    string(24) "доставленные"
    [4]=>
    string(20) "неудобства"
  }
}
Answer 2

Как вырезать текст в этих скобках и поместить его в в массив?

  1. Получаете в цикле первый символ из строки
  2. Если первый символ - открывающая скобка, активируете переключатель $switch = 1;
  3. Если переключатель активен $switch == 1, сохраняете текущий символ в массив
  4. Если текущий символ - закрывающая скобка, деактивируете переключатель $switch = 0;
  5. Полученный массив объединяете по словам, и разбиваете по предложениям.
$y = '(Уважаемые клиенты)! У некоторых пользователей могут быть трудности с отображением полисов ДМС (в личном кабинете). Спешим вас заверить, что все ваши полисы - действительны (и на их актуальность это не повлияет). В настоящее время мы работаем над проблемой отображения. (Приносим извинения за доставленные неудобства).';
$new = [];
$switch = 0;
$strlen = mb_strlen($y);
while ($strlen) {
    $first = mb_substr($y, 0, 1, 'UTF-8');
    $y = mb_substr($y, 1, $strlen, 'UTF-8');
    $strlen = mb_strlen($y);
    $first != '(' ?: $switch = 1;
    if ($switch == 1 && $first != '(') {
        if ($first == ')') {
            $switch = 0;
            $new[] = '^';
        } else {
            $new[] = $first;
        }
    }
}
$tmp = trim(join($new), '^');
$new = explode('^', $tmp);
print_r($new);

Результат:

Array
(
    [0] => Уважаемые клиенты
    [1] => в личном кабинете
    [2] => и на их актуальность это не повлияет
    [3] => Приносим извинения за доставленные неудобства
)
Answer 3

Вам нужен конечный автомат (которым, кстати и являются регулярные выражения). Перебираете символы. Если встретили один из ключевых - скобка открывающаяся или закрывающаяся, то в первом случае переключаете автомат в режим накопления фразы в скобках, а во втором выходите из этого режима запомнив то что накопилось.

Это частный простой случай. В общем случае автомата у вас была бы матрица переходов - из какого состояния в какое можно перейти при каких условиях. Так можно было бы распарсить что угодно сложное. Например, математические выражения и формулы.

$y = '(Уважаемые клиенты)! У некоторых .. ДМС (в личном кабинете). Спешим .. действительны (и на .. повлияет). В настоящее .. отображения. (Приносим .. неудобства).';
$found = [];
$word = "";
$eat = false;
for ($i = 0; $i < strlen($y); $i++) {
    $ch = $y[$i];
    if ($ch === "(") {
        $eat = true;
    } elseif ($ch === ")") {
        $eat = false;
        $found[] = $word;
        $word = "";
    } elseif ($eat) {
        $word .= $ch;
    }
}
var_dump($found);

Результат:

array(4) {
  [0] => string(33) "Уважаемые клиенты"
  [1] => string(32) "в личном кабинете"
  [2] => string(27) "и на .. повлияет"
  [3] => string(40) "Приносим .. неудобства"
}
READ ALSO
Как правильно перестроить запрос в yii2?

Как правильно перестроить запрос в yii2?

как перестроить такой запрос под findOne()?

206
Ошибка в отправке письма на почту

Ошибка в отправке письма на почту

Есть такой код отправки содержимого корзины на мылоПочему каждый товар отправляется своим письмом (например, если в корзине 3 товара = 3 отдельных...

184
Указать путь к подключаемому файлу

Указать путь к подключаемому файлу

Есть такая структура папок:

157
Настройка поиска по связанным полям

Настройка поиска по связанным полям

Настраиваю поиск в гридвью, столкнулась с банальной проблемойВ выводимой таблице на поля из связанных таблиц не добавляется поиск

176