1

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

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

4

4 回答 4

4

它不能通过正则表达式来完成。它不是一种常规语言。它的一般解析。

$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
)
于 2012-04-07T06:40:33.607 回答
3

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

你应该用 php 编码。

于 2012-04-07T06:35:58.727 回答
0

这可以用吗?

preg_match_all('/DS\(...(\d)+ \)?\(?[DS]?/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
于 2012-04-07T06:39:13.677 回答
-1

使用函数 substr 从 DS 出现的地方取出子字符串,并从中取出数据。要获取数据,只需解析保留左括号计数的子字符串。当右括号开始时,记下它们的数量。当这个计数和之前的计数相等时,你就得到了你的数据。

于 2012-04-07T06:36:22.520 回答