Как разделить стоимость - PullRequest
3 голосов
/ 18 марта 2010

Я хочу разделить значение.

$value = "code1.code2.code3.code4(code5.code6(arg1.arg2, arg3), code7.code8)";

Я хочу разделить вот так.

Array
(
    [0] => code1
    [1] => code2
    [2] => code3
    [3] => code4(code5.code6(arg1.arg2, arg3), code7.code8)
)

Я использовал взорвать ('.', $ Value), но взорвать разделить в скобках значение. Я не хочу разделять в скобках значение. Как я могу это сделать?

Ответы [ 5 ]

3 голосов
/ 18 марта 2010

Вам нужен preg_match_all и рекурсивное регулярное выражение для обработки вложенного паретеза

$ re = '~ ([^. ()] * ((([^ ()] + | (? 2)) *))) | ([^. ()] +) ~ x ';

  $re = '~( [^.()]* ( \( ( [^()]+ | (?2) )* \) ) ) | ( [^.()]+ )~x';

тест

 $value = "code1.code2.code3.code4(code5.code6(arg1.arg2, arg3), code7.code8).xx.yy(more.and(more.and)more).zz";

 preg_match_all($re, $value, $m, PREG_PATTERN_ORDER);
 print_r($m[0]);

результат

[0] => code1
[1] => code2
[2] => code3
[3] => code4(code5.code6(arg1.arg2, arg3), code7.code8)
[4] => xx
[5] => yy(more.and(more.and)more)
[6] => zz
1 голос
/ 18 марта 2010

Разнесение имеет предельный параметр:

$array = explode('.', $value, 4);

http://us.php.net/manual/en/function.explode.php

0 голосов
/ 18 марта 2010

Простой парсер:

$string = "code1.code2.code3.code4(code5.code6(arg1.arg2, arg3), code7.code8)code1.code2.code3.code4(code5.code6(arg1.arg2, arg3), code7.code8)";
$out = array();
$inparen = 0;
$buf = '';
for($i=0; $i<strlen($string); ++$i) {
    if($string[$i] == '(') ++$inparen;
    elseif($string[$i] == ')') --$inparen;

    if($string[$i] == '.' && !$inparen) {
        $out[] = $buf;
        $buf = '';
        continue;
    }
    $buf .= $string[$i];

}
if($buf) $out[] = $buf;
0 голосов
/ 18 марта 2010

Я думаю, что это сработает:

function split_value($value) {
    $split_values = array();
    $depth = 0;

    foreach (explode('.', $value) as $chunk) {
        if ($depth === 0) {
            $split_values[] = $chunk;
        } else {
            $split_values[count($split_values) - 1] .= '.' . $chunk;
        }

        $depth += substr_count($chunk, '(');
        $depth -= substr_count($chunk, ')');
    }

    return $split_values;
}

$value = "code1.code2.code3.code4(code5.code6(arg1.arg2, arg3), code7.code8).code9.code10((code11.code12)).code13";

var_dump(split_value($value));
0 голосов
/ 18 марта 2010

можете ли вы использовать что-то кроме '.' разделить коды, которые вы хотите разделить на? В противном случае вам потребуется заменить регулярное выражение.

$value = "code1|code2|code3|code4(code5.code6(arg1.arg2, arg3), code7.code8)";
$array = explode('|', $value);

Array
(
    [0] => code1
    [1] => code2
    [2] => code3
    [1] => code4(code5.code6(arg1.arg2, arg3), code7.code8)
)
...