在php中快速查找括号的方法

时间:2012-04-07 06:24:15

标签: php regex parsing

我有一个这样的字符串: (... 1(...... 2 DS(... 3(... 4)))))

如果我不知道DS结束之前有多少括号,那么最好在DS括号中查找数据? (3,4) 它就像数学:在3和4括号上乘以ds。

4 个答案:

答案 0 :(得分:4)

通过正则表达式无法完成。它不是regular language。它的一般解析。

$data  = '(...1 (...2 DS(...3 ( ...4 ) 5) )6 )';
$num   = array();
$start = strpos($data, 'DS') + strlen('DS');
$end   = strlen($data) - 1;
$paren = 0;
for ($i = $start;$i <= $end;$i++) {
    $n = $data[$i];
    if ($n == '(') $paren++;
    if ($n == ')') $paren--;
    if ($paren >= 0 && is_numeric($n)) {
        $num[] = $n;
    }
}
print_r($num);

<强>输出

Array
(
    [0] => 3
    [1] => 4
    [2] => 5
)

答案 1 :(得分:3)

使用正则表达式是不可能的。 正则表达式无法保存有多少个开括号......

你应该用php编写代码。

答案 2 :(得分:0)

这可以用吗?

preg_match_all('/DS\(...(\d)+ \)?\(?[DS]?/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];

答案 3 :(得分:-1)

使用函数substr从DS出现的位置获取子字符串,并从中获取数据。 要获取数据,只需解析子字符串,保持开括号的计数。当结束括号开始时,保持计数。当此计数和先前计数相等时,您已获得数据。