Вы можете соответствовать вхождения непробельных кусков текста после определенного текста, имеющего некоторый текст далее в строке, используя
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 демо .