1

このようなブラケット付きコードを分離するために、現在いくつかの正規表現に取り組んでいます...

Regex: /\[(.*?)\]/

String: "<strong>[name]</strong>
<a href="http://www.example.com/place/[id]/">For more info...</a>"

Matched Fields: name, id

これをもう少し高度なものにしようと思っています。私がやりたいことは...

String: "[if:name <strong>[name]</strong>]
<a href="http://www.example.com/place/[id]/">For more info...</a>"

Matched Fields: if:name <strong>[name]</strong>, id

問題は、これで機能する正規表現が見つからないことです。私は一日の半分以上を殺したと確信しており、かなり近づいているように感じます.

現時点で私が望んでいることをしていないものは次のとおりです...

/\[([^\]]+)\]/

誰にもアイデアはありますか?

4

4 に答える 4

0
\[(.*)\]

正規表現の視覚化

Debuggex でライブ編集

于 2013-09-06T21:30:15.807 に答える
0

これは、バランスの取れたブラケットおよび/または内側のブラケットの再帰コアが必要な場合に役立ちます。多くのネストされたレベルを実行できます。これは、より複雑な使用法を想定した単なるフレームワークです。バランスの取れたテキスト部分は実際には簡単です。

 # (?:(?>[^\\\[\]]+|(?:\\[\S\s])+)|(?>\[((?:(?&core)|))\]())|([\[\]])())(?:\2|\4)(?(DEFINE)(?<core>(?>[^\\\[\]]++|(?:\\[\S\s])++|\[(?:(?&core)|)\])+))

 (?:
      (?>
           [^\\\[\]]+ 
        |  
           (?: \\ [\S\s] )+
      )
   |  
      (?>
           \[
           (                       # (1) core content
                (?:
                     (?&core) 
                  |  
                )
           )
           \]
           ( )                     # (2) core flag
      )
   |  
      # unbalanced '[' or ']'
      ( [\[\]] )                   # (3) error content
      ( )                          # (4) error flag
 )

 (?: \2 | \4 )            # only let match if core flag or error flag is set
                          # this filters search to square brackets only
 (?(DEFINE)
      # core
      (?<core>
           (?>
                [^\\\[\]]++ 
             |  
                (?: \\ [\S\s] )++
             |  
                \[
                # recurse core
                (?:
                     (?&core) 
                  |  
                )
                \]
           )+
      )
 )


 # Perl sample, but regex should be valid in php
 # ----------------------------
 # use strict;
 # use warnings;
 # 
 # 
 # $/ = "";
 # 
 # my $data = <DATA> ;
 # 
 # parse( $data ) ;
 # 
 # 
 # sub parse
 # {
 #      my( $str ) = @_;
 #      while 
 #      (
 #           $ str =~ /
 #               (?:(?>[^\\\[\]]+|(?:\\[\S\s])+)|(?>\[((?:(?&core)|))\]())|([\[\]])())(?:\2|\4)(?(DEFINE)(?<core>(?>[^\\\[\]]++|(?:\\[\S\s])++|\[(?:(?&core)|)\])+))
 #           /xg 
 #      )
 #      
 #      {
 #           if ( defined $1 )
 #           {
 #                print "found core \[$1\] \n";
 #                parse( $1 ) ;
 #           }
 #           if ( defined $3 )
 #           {
 #                print "unbalanced error '$3' \n";
 #           }
 #           
 #      }     
 # }
 # __DATA__
 # 
 # this [ [ is a test
 # [ outter [ inner ] ]
于 2013-09-06T23:19:01.880 に答える