<?php
$text= 'бла - бла - бла {первый1|первый2|{второй1|второй2|второй3|{ третий|третий2}}|первый3|первый4} {далее1|далее2} ла л ал а';
function process_text($text)
{
$pos = strpos($text, '{');
if ($pos === false)
{
return array($text);
}
else
{
$text1 = substr($text, 0, $pos);
$k = 0;
$alt = array();
$a_start = $pos+1;
for ($i=$pos+1; $i<strlen($text); $i++)
{
switch ($text[$i])
{
case '{':
$k++;
break;
case '}':
$k--;
break;
case '|':
if (!$k)
{
$alt[] = substr($text, $a_start, $i-$a_start);
$a_start = $i+1;
}
break;
}
if ($k<0)
{
break;
}
}
if ($i>= strlen($text))
{
// Ошибка: скобка не закрыта
}
$alt[] = substr($text, $a_start, $i-$a_start);
$alt_processed = array();
foreach ($alt as $a)
{
$alt_processed[] = process_text($a);
}
return array_merge( array($text1, $alt_processed), process_text(substr($text, $i+1)) );
}
}
$array = process_text($text);
$res = get_all($array);
print_r($res);
function get_all($array)
{
if (!is_array($array))
{
return array($array);
}
$parts = array();
foreach ($array as $p)
{
if (is_array($p))
{
$alts = array();
foreach ($p as $alt)
{
$alts = array_merge($alts, get_all($alt));
}
$parts[] = $alts;
}
else
{
$parts[] = array($p);
}
}
$res = array();
$current = array();
$indexes = array(0);
$k = 0;
while ($k>=0)
{
while ($indexes[$k] < count($parts[$k]))
{
$current[$k] = $parts[$k][$indexes[$k]++];
if ($k+1 < count($parts) )
{
$k++;
$indexes[$k] = 0;
}
else
{
$res[] = implode('', $current);
}
}
$k--;
}
return $res;
}
?>