@Leopandro
Разработчик CRM/ERP систем

Как разделить строку по скобкам, внутри которых еще есть скобки?

Допустим текст
(Lorem ipsum) dolor sit amet, (consectetur adipiscing elit, (sed do eiusmod))
Разделить на:
(Lorem ipsum)
 dolor sit amet, 
(consectetur adipiscing elit, (sed do eiusmod))


Пробовал так:
\((.+)\)
preg_split("/\((.*?)\)/", $this->text, -1, PREG_SPLIT_DELIM_CAPTURE);

Но он работает некорректно
  • Вопрос задан
  • 591 просмотр
Решения вопроса 1
@Leopandro Автор вопроса
Разработчик CRM/ERP систем
Короче говоря, решение задачи посложнее этой. Очень интересное:
$rand_sentence = "{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}";

$regexp = '#\{((?>[^{}]+)*)\}#';

while(strpos($rand_sentence, '{') !== false)
   $rand_sentence = preg_replace_callback($regexp, 'replace_match_str', $rand_sentence);

echo $rand_sentence . "\n";


function replace_match_str($str)
{
   $result = explode("|", $str[1]); // split string by "|" symbol
   $replacement = array_rand($result); // random array ellement

   return $result[$replacement];
}


Этот вопрос задавал чтобы решить часть этой задачи.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
prototype_denis
@prototype_denis
Symfony
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('xdebug.var_display_max_depth', -1);

$input = '(Lorem ipsum) dolor sit amet, (consectetur adipiscing elit, (sed do eiusmod))';
$output = '';

$left = '(';
$right = ')';

$chars = preg_split('//u', $input, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

$balance = 0;
foreach ($chars as $char) {
    if ($char === $left) {
        ++$balance;
        if ($balance === 1 || $balance === 0) {
            $output .= PHP_EOL.$char;
        }
    } elseif ($char !== $left && $char !== $right) {
        $output .= $char;
    } elseif ($char === $right) {
        --$balance;
        if ($balance === -1 || $balance === 0) {
            $output .= $char.PHP_EOL;
        }
    }
}

$output = trim($output);

echo '<pre>';
var_dump($output);
echo '</pre>';
exit('File:'.__FILE__.' Line:'.__LINE__);
Ответ написан
Daniro_San
@Daniro_San
Программист
Задайте переменную - счетчик открытых скобок. Пройдитесь циклом по строке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы