Regex: совпадение штук внутри абзаца - PullRequest
2 голосов
/ 11 февраля 2010

Я хочу сопоставить значения для 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 ]

2 голосов
/ 11 февраля 2010

Вам придется запретить двойной перевод строки. Если ваш двигатель позволяет заглядывать в глаза:

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

Это будет работать на новых строках Windows / UNIX, но не на Mac. Это также гарантирует, что A и C находятся в начале строки (обратите внимание на модификатор m).

0 голосов
/ 11 февраля 2010
$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
)
0 голосов
/ 11 февраля 2010

Это работает для меня:

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

По сути, включить новые строки (удалить. Включая новые строки), а затем специально учесть те новые строки (\v), которые вы ожидаете в своем шаблоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...