Как я могу написать регулярное выражение для выбора повторяющихся шаблонов в PHP из файла - PullRequest
1 голос
/ 26 марта 2019

С этой строкой из файла с похожими строками,

03/21/19 11:20 LOC3 UNA:
03/21/19 11:40 LOC2 IN: NEW BD     PN  VO    LVA
03/21/19 11:50 LOC3 OFF:
03/21/19 12:20 LOC2 IN: OLD XD     AB  VO    LVA

Мне нужно захватить NEW, BD, PN, VO, LVA из извести 1 и OLD, XD, AB, VO, LVA в строке 2 и т. Д., Игнорируя другие строки

Это выбирает только последний термин 'VO'

IN:\s(([^\s]+)\s+)+.*LVA

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Вы можете соответствовать вхождения непробельных кусков текста после определенного текста, имеющего некоторый текст далее в строке, используя

preg_match_all('~(?:\G(?!\A)(?=.*LVA)|IN:)\h+\K\S+~', $s, $matches)

См. Демоверсию regex

Подробнее

  • (?:\G(?!\A)(?=.*LVA)|IN:) - либо конец предыдущего соответствия (с LVA позже в строке после 0+ символов, отличных от символов разрыва строки), либо IN: подстрока (в основном, это означает совпадение последовательных подстрок которые встречают образец после IN:, но только если есть LVA позже )
  • \h+ - 1+ горизонтальных пробелов
  • \K - оператор сброса совпадений
  • \S+ - 1+ непробельных символов.

PHP

$s = "03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA";
if (preg_match_all('~(?:\G(?!\A)(?=.*LVA)|IN:)\h+\K\S+~', $s, $matches)) {
    print_r($matches[0]);
}
// => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO [4] => LVA )

Чтобы получить несколько совпадений, оберните шаблон в первой группе без захвата с группой захвата, а затем проверьте подвыборки при построении окончательного результата. Что-то вроде

$s = "03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA
03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA VB";
$res = [];
if (preg_match_all('~(?:\G(?!\A)(?=.*LVA)|(IN:))\h+\K\S+~', $s, $matches, PREG_SET_ORDER, 0)) {
    $tmp = [];
    foreach ($matches as $r) {
        if (count($r) > 1) {
            if (count($tmp)>0) {
                $res[] = $tmp;
                $tmp = [];
            }
        }
        $tmp[] = $r[0];
    }
    if (count($tmp)>0) {
        $res[] = $tmp;
    }
}
print_r($res);
// => Array (
//     [0] => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO  [4] => A )
//     [1] => Array ( [0] => NEW [1] => BD [2] => PN [3] => VO  [4] => LVA )
// )

См. PHP демо .

0 голосов
/ 26 марта 2019

Если строка всегда имеет один и тот же шаблон, вы можете использовать бюджетное решение, взорвавшись на новой строке и ": " и получив последнее значение.

$str = "03/21/19 11:20 LOC2 IN: NEW BD     PN  VO    LVA
03/21/19 11:20 LOC2 IN: OLD XD     AB  VO    LVA";

foreach(explode("\n", $str) as $line){
    $tmp = explode(": ", $line);
    $result[] = end($tmp);
}

var_dump($result);

https://3v4l.org/IbfBo

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