正则表达式:匹配段落内的东西

时间:2010-02-11 13:42:07

标签: php regex

我希望匹配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 个答案:

答案 0 :(得分:2)

你必须禁止双换行。如果您的引擎允许前瞻:

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

这适用于Windows / UNIX换行符,但不适用于Mac。这也将确保A和C位于一行的开头(注意m修饰符)。

答案 1 :(得分:0)

这对我有用:

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

基本上启用换行符(删除。包括换行符),然后专门说明您在模式中预期的换行符(\v)。

答案 2 :(得分:0)

$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
)