2013-10-24 5 views
2

데이터베이스에 삽입 할 데이터가있는 거대한 텍스트 파일이 있습니다. 사실 나는 정규식 좀 안돼서, 문제는 내가 모든 데이터를 삽입하지 않는다는 것입니다, 나는 어떤으로, preg_match_all()를 할 수없는 것 :PHP 정규식이 일치하지 않습니다

file.txt를

[03-07-2010 09:03:23] : [180.20.106.107] : [/success]: 
     [SEND] invite -> helen, 
     [SEND] uname -> test, 
     [SEND] fname -> test, 

[03-07-2010 09:04:28] : [180.20.106.107] : [/success]: 
     [SEND] invite -> helen3, 
     [SEND] uname -> test3, 
     [SEND] fname -> test3, 
     [SEND] register -> register, 

[03-07-2010 09:07:43] : [180.20.106.107] : [/success]: 
     [SEND] invite -> register, 
     [SEND] uname -> helen2, 
     [SEND] fname -> none, 

[03-07-2010 09:09:48] : [180.20.106.107] : [/success]: 
     [SEND] invite -> helen2, 
     [SEND] uname -> test2, 
     [SEND] fname -> test2, 

[03-07-2010 10:14:18] : [180.20.106.107] : [/success]: 
     [SEND] invite -> register, 
     [SEND] uname -> mickey, 
     [SEND] fname -> test8, 
     [SEND] register -> register, 

는 난 단지 그 블록 (register -> register)의 마지막에 끝 register -> register,[03-07-2010 10:14:18]까지 시작 [03-07-2010 09:04:28]에서 의미 register이있는 블록을 추출 할. 이 작동하지 않는

나는 많은 것들을 시도하지만, 내가 말했듯이, 나는 정규식

에서 초보자를 해요 :

#\[(.*)\] : \[(.*)\] : \[\/success\]:(.*)register -> register#s 
+0

추출 등록이 단 하나의 블록? 또는 레지스터가 포함 된 블록을 추출 하시겠습니까? 기대되는 결과는 무엇입니까? – hwnd

+0

적절한 전환이 없으면 정규식 검색은 행당 검색 만합니다. –

답변

2

당신이 ungreedy 한정 기호를 사용해야합니다 몇 군데있다 그러나 그것은 문제가 아닙니다.

다른 행에서 데이터를 가져 오는 중 문제가 발생했습니다. .은 구체적으로 s 수식어를 사용하지 않는 한 개행과 일치하지 않습니다.

타임 스탬프와 IP가있는 첫 번째 줄과 일치하므로 register -> register 줄까지 건너 뛰고 "오 이런 작품!"이라고 말하면 단일 정규식으로는이 작업을 수행 할 수 없습니다. "

대신에, 나는, 개개의 블록으로 피사체 문자열을 분할하는 것이 좋습니다 그래서 같은 :

$blocks = preg_split("/\r?\n\s*\r?\n/",$inputText); 
foreach($blocks as $block) { 
    list($first,$data) = explode("\n",$block,2); 
    if(preg_match("/\bregister\s*->\s*register\b/",$data)) { 
     preg_match_all("/\[(.*?)\]/",$first,$m,PREG_SET_ORDER); 
     list($timestamp,$ip) = $m[0]; 
     // do something here with the information. 
    } 
} 
관련 문제