【问题标题】:Get inside of parent blocks in php regex进入 php 正则表达式中的父块
【发布时间】:2016-12-07 04:12:37
【问题描述】:

你好,我有 2 个父(或更多...)块和其中的许多子块。

Block1 {

    blockchild1 {

    }

    blockchild2 {

    }

    , ...
}

Block2 {

    blockchild1 {

    }

    blockchild2 {

    }

    , ...
}

我想使用 php 正则表达式并首先获取所有父块内部

([a-z-0-9]*)\s*[{](.*?)[}]

但是这个正则表达式在到达第一个子块时停止关闭 } 意味着第一个数据接收是

Block1 {

    blockchild1 {

    }

但我想得到这样的东西

array 1 = Block1
array 2 = blockchild1 {

    }

    blockchild2 {

    }

    , ...

我希望正则表达式通过子块[}] 并获取父块内的所有内容。我的正则表达式是 PCRE (PHP)

【问题讨论】:

    标签: php pcre pcregrep


    【解决方案1】:

    你需要使用递归模式:

    $pattern = '~(\w+)\s*{([^{}]*(?:{(?2)}[^{}]*)*)}~';
    

    详情:

    ~ # delimiter
    (\w+) # capture group 1: block name
    \s* # eventual whitespaces
    {
    (   # capture group 2
        [^{}]* # all that isn't a curly bracket
        (?:
            { (?2) } # reference to the capture group 2 subpattern
            [^{}]*
        )*
    )
    }
    ~
    

    请注意,对捕获组 2 的引用位于捕获组 2 本身内部,这就是模式是递归的原因。

    【讨论】:

      【解决方案2】:

      试试这个:

      $str = 'Block1 {
      
          block1child1 {
      
          }
      
          block1child2 {
      
          }
      
          block1child3 {
      
          }
      }
      
      Block2 {
      
          block2child1 {
      
          }
      
          block2child2 {
      
          }
      
      }';
      
      $sub = '(\s*[a-z-0-9]*\s*{.*?}\s*)*';
      preg_match_all("/([a-z-0-9]*)\s*{($sub)}/sim", $str, $matches, PREG_SET_ORDER);
      
      var_dump($matches);
      

      我使用变量$sub 来阐明方法。它返回:

      $matches[0][1] = 'Block1';
      $matches[0][2] = '
      
      
      
      block1child1 {
      
      
      
      }
      
      
      
      block1child2 {
      
      
      
      }
      
      
      
      block1child3 {
      
      
      
      }
      
      ';
      

      它包含 Block2 的正确输出(索引 1 of $matches)。 此正则表达式不适用于子块中的嵌套块,也不适用于父块中除块之外的任何其他内容。但是你没有提到这些。

      这里是online version。

      【讨论】:

      • 还是谢谢你。但我想把所有东西都放在里面,而不仅仅是孩子们的积木
      【解决方案3】:
      $str = 'Block1 {
      
          block1child1 {
      
          }
      
          block1child2 {
      
          }
      
          block1child3 {
      
          }
      }
      
      Block2 {
      
          block2child1 {
      
          }
      
          block2child2 {
      
          }
      
      }';
      
      $str = preg_replace('([\w\d]+)', '"$0"', $str);
      $str = str_replace(' {', ': {', $str);
      $str = str_replace('}', '},', $str);
      $str = preg_replace('/\}\,[.\n]*?}/', '}}', $str);
      
      
      $str =  json_decode('{' . substr($str, 0, strlen($str) - 1)  . '}', true);
      
      var_export($str);
      
      array (
        'Block1' => 
        array (
          'block1child1' => 
          array (
          ),
          'block1child2' => 
          array (
          ),
          'block1child3' => 
          array (
          ),
        ),
        'Block2' => 
        array (
          'block2child1' => 
          array (
          ),
          'block2child2' => 
          array (
          ),
        ),
      )
      
      1. 将字符串转换为 JSON
      2. 将 JSON 转换为数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多