【问题标题】:Fast way to find bracket in php在php中查找括号的快速方法
【发布时间】:2012-04-07 06:24:14
【问题描述】:

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

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

【问题讨论】:

  • 您可能必须实现一个小型解析器,使用堆栈来管理您当前正在查看的括号集。
  • 查看@shiplu.mokadd.im 的答案以获得合理的示例。

标签: php regex parsing


【解决方案1】:

不能通过正则表达式来完成。它不是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
)

【讨论】:

    【解决方案2】:

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

    你应该用php编码。

    【讨论】:

      【解决方案3】:

      这个能用吗?

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 他不知道“DS 后面有多少个括号才结束?”,这意味着他需要 DS 的内容相对于括号保持平衡。所以一个简单的子字符串是行不通的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2012-11-09
        相关资源
        最近更新 更多