Regex Capture Text между словами, очень условно - PullRequest
0 голосов
/ 20 ноября 2010

Вытаскивая при этом волосы:

Я пытаюсь зафиксировать текст между этими словами, и неизменно получаю разные результаты.

Текущий код:

preg_match_all("/ID:([0-9A-Za-z]+)/",$data,$ids);

if (count($ids[0]) > 1) {
 $data = str_replace($ids[0][1],"",$data);
}

preg_match("/ORIG:(.*)ID:.*/",$data,$matches);

$name = $matches[1];

if (FALSE !== $heh = strpos($name,"SND BK:")) { 
 $name = substr($name,0,$heh);
}

Пример данных:

ORIG:FIRSTNAME LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK DET:MEMO
ORIG:FIRSTNAME LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK ID:123123123 DET:MEMO
ORIG:FIRSTNAME LASTNAME ID:123123123 DET:MEMO

Мне нужно полностью захватить данные между ORIG и DET.RegEx, который я продолжаю делать, всегда заканчивается получением одного из идентификаторов, когда у меня есть два идентификатора в поле.Иногда ORIG даже не захватывается.

Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2010

Могу ли я предложить добавить якорь и использовать многострочный, если эти данные находятся в одной строке:

<?php

$subject = <<<SUBJ
ORIG:FIRSTNAME FIRST LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK DET:MEMO
ORIG:FIRSTNAME SECOND LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK ID:123123123 DET:MEMO
ORIG:FIRSTNAME THIRD LASTNAME ID:123123123 DET:MEMO
SUBJ;

$pattern = ' /^ORIG:(.*)DET:/m';

preg_match_all($pattern, $subject, $matches);

print_r($matches);

?>

Возвращает:

Array
(
    [0] => Array
        (
            [0] => ORIG:FIRSTNAME FIRST LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK DET:
            [1] => ORIG:FIRSTNAME SECOND LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK ID:123123123 DET:
            [2] => ORIG:FIRSTNAME THIRD LASTNAME ID:123123123 DET:
        )

    [1] => Array
        (
            [0] => FIRSTNAME FIRST LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK 
            [1] => FIRSTNAME SECOND LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK ID:123123123 
            [2] => FIRSTNAME THIRD LASTNAME ID:123123123 
        )

)
0 голосов
/ 20 ноября 2010

Может быть, я не совсем понимаю, что вы пытаетесь здесь, но если вы воспользуетесь следующим, у вас будет все между orig и det.

(ORIG:) (DET)

(*).

Пример:

preg_match_all('/(ORIG:)(.*)(DET)/',
              'ORIG:FIRSTNAME LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK DET:MEMO',
              $result);

var_dump($result);

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(66) "ORIG:FIRSTNAME LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK DET"
  }
  [1]=>
  array(1) {
    [0]=>
    string(5) "ORIG:"
  }
  [2]=>
  array(1) {
    [0]=>
    string(58) "FIRSTNAME LASTNAME ID:123123123 SND BK:TIB BANK BANK BANK "
  }
  [3]=>
  array(1) {
    [0]=>
    string(3) "DET"
  }
}
...