代码之家  ›  专栏  ›  技术社区  ›  blinry

regex:匹配段落内的内容

  •  2
  • blinry  · 技术社区  · 15 年前

    我想匹配a和c的值,但前提是它们在同一段落中。

    A:one
    C:foo
    
    A:two
    B:rofl, some rubbish :::
    
    A:three
    B:lol
    C:bar
    

    现在我正在使用

    /A:([a-z]*).*?C:([a-z]*)/s
    

    但这给了我“两个”和“酒吧”,它们不属于一起。如何排除/*中的空行?/是吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Max Shawabkeh    15 年前

    /^A:([a-z]*)(?:(?!(?:\r?\n){2,}).)*^C:([a-z]*)/sm
    

    m

        2
  •  0
  •   SoapBox    15 年前

    /A:([a-z]*)\v*.*\v?C:([a-z]*)\v*/m
    

    \v

        3
  •  0
  •   ghostdog74    15 年前
    $str=<<<A
    A:one
    C:foo
    
    A:two
    B:rofl, some rubbish :::
    
    A:three
    B:lol
    C:bar
    A;
    
    $s = explode("\n\n",$str);
    foreach($s as $k){
        if(strpos($k,"A:") !==FALSE && strpos($k,"C:") !==FALSE){
            $a = array_filter ( ( preg_split("/([A-Z]):|\n+/sm",$k) ) );
            print_r($a);
        }
    }
    

    $ php test.php
    Array
    (
        [1] => one
        [3] => foo
    )
    Array
    (
        [1] => three
        [3] => lol
        [5] => bar
    )