如何拆分价值

时间:2010-03-17 21:07:22

标签: php split

我想分割价值。

$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)
)

我使用了explode('。',$ value)但是在括号中爆炸分裂。我不希望在括号中拆分值。 我该怎么办?

5 个答案:

答案 0 :(得分:3)

你需要preg_match_all和递归正则表达式来处理嵌套的parethesis

$ 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 :(得分:1)

explode有一个限制参数:

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

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

答案 2 :(得分:0)

你可以使用“。”以外的东西吗?分开你想拆分的代码?否则,您需要正则表达式替换。

$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)
)

答案 3 :(得分:0)

我认为这会奏效:

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));

答案 4 :(得分:0)

一个简单的解析器:

$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;