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

在php中快速查找括号的方法,php,regex,parsing,Php,Regex,Parsing,我有这样一个字符串: (…1(…2 DS(…3(…4))) 如果我不知道在结束前DS后面有多少括号,那么在DS括号中查找数据的最佳方法是什么?(3, 4) 这就像数学:在3和4个括号中乘以ds。使用正则表达式是不可能的。 正则表达式无法保存有多少个开括号 您应该用php编写代码。使用正则表达式是不可能的。 正则表达式无法保存有多少个开括号 您应该使用php编写它。使用函数substr从DS出现的位置获取子字符串,并从中获取数据。 要获取数据,只需解析子字符串,并保留打开方括号的计数。当结束括号开

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

如果我不知道在结束前DS后面有多少括号,那么在DS括号中查找数据的最佳方法是什么?(3, 4)
这就像数学:在3和4个括号中乘以ds。

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


您应该用php编写代码。

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


您应该使用php编写它。

使用函数substr从DS出现的位置获取子字符串,并从中获取数据。
要获取数据,只需解析子字符串,并保留打开方括号的计数。当结束括号开始时,对其进行计数。当此计数和上一计数相等时,您就得到了数据

使用substr函数从DS出现的位置获取子字符串,并从中获取数据。
要获取数据,只需解析子字符串,并保留打开方括号的计数。当结束括号开始时,对其进行计数。当此计数和上一计数相等时,您就得到了数据

这对它有用吗

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

这对它有用吗

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

它不能由正则表达式完成。这不是一个好主意。它的一般解析

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

它不能由正则表达式完成。这不是一个好主意。它的一般解析

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

您可能需要实现一个小型解析器,使用堆栈管理当前正在查看的括号集。有关合理的示例,请参阅@shiplu.mokadd.im的答案。您可能需要实现一个小型解析器,使用堆栈管理您当前正在查看的括号集。有关合理的示例,请参阅@shiplu.mokadd.im的答案。他不知道“结束前DS后有多少括号?”,这意味着他需要DS的内容与括号保持平衡。因此,一个简单的子字符串是不行的。他不知道“在结束前DS后面有多少括号?”,这意味着他需要DS的内容与括号平衡。因此,一个简单的子字符串无法实现这一点。