我想分割价值。
$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)但是在括号中爆炸分裂。我不希望在括号中拆分值。 我该怎么办?
答案 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)
答案 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;