2010-12-21 6 views
1

관련 정보를 알아 내는데 필요한 많은 양의 로그 데이터가 있습니다. 구문은 다음과 같습니다주변 데이터가있는 preg_match_all

WORD1 some text KEYWORD some text WORD2 WORD1 some text KEYWORD some text WORD2 WORD1 some text KEYWORD some text WORD2 WORD1 some text KEYWORD some text WORD2 

그것에서 특정 블록을 얻기 위해 정규식을 사용하는 것이 가능할 것이다 - 나는 몇 가지 키워드를 조회 할 때이 WORD1 some text THIS_KEYWORD some text WORD2

PS를 반환하도록 : 여러 인스턴스가있을 수 있습니다 한 키워드의 모든 블록을 반환해야합니다 (preg_match_all, PREG_SET_ORDER?).

+0

항상'WORD1'와'WORD2'있을 것인가? – codaddict

+0

예, 기본적으로 각 단어 블록을 시작하고 끝내는 시스템 로그 파일입니다. – user323304

답변

1

의견에 따르면 각 블록마다 항상 시작 단어와 끝 단어가 있습니다. 당신은 다음과 같은 작업을 수행 할 수

:

  • 분할 블록으로 입력 문자열 (배열)가 포함되어 있습니다. 블록의 끝은 인 공백으로 식별 된 이며, 뒤에 WORD2이고 뒤에는 WORD1이옵니다.
  • 위의 배열에서 키워드를 검색하십시오.

.

$arr = preg_split('/(?<=WORD2)\s+(?=WORD1)/',$log); 
$keyword = 'KEYWORD1'; 
$result = preg_grep("/\b$keyword\b/",$arr); 

Ideone Link

+0

감사합니다! – user323304

0

사용 UNGREEDY 수정 같이

$found = preg_match_all("/WORD1.*KEYWORD.*WORD2/U",$x,$match); 
if($found) print_r($match[0]); 
+1

작동하지 않습니다. '$ x = WORD1 foo KEYWORDx bar WORD2 WORD1 foo KEYWORD bar WORD2' – codaddict

+0

오해. KEYWORD를 하위 문자열의 일부로 간주했습니다. 귀하의 요점에서 정규 표현식은 물론 "/WORD1.*\bKEYWORD\b.*WORD2/U"이어야합니다. –