2012-03-21 3 views
0

PHP로 파일을 처리하고 있습니다.정규 표현식 : 특정 단어까지 모두 일치 (PHP)

이 파일에는 항상 "단계"(1 단계, 2 단계 등)라는 단어로 시작하고 항상 "끝 단계"로 끝나는 몇 개의 블록이 들어 있습니다. 끝내면 개행을 할 수는 있지만 결코 결과는 2 개가 될 수 없습니다.

배열로 바꾸는 정규식을 작성하려고합니다. 내가 가진 무엇

지금까지

preg_match_all("/Step([^\"end step\"]*)/s", $content, $matches); 

patnern의 끝에/s이 (가) newslines 너무 포함 할 수 있도록이다. 물론, "end step"의 모든 글자가 1 단어를 형성 할 때뿐만 아니라 제외되기 때문에 이것은 작동하지 않습니다. 올바른 정규식을 작성하려면 어떻게해야합니까?

+0

파일 내용의 일부를 게시 할 수 있습니까? –

+0

일치하는 텍스트의 예를 게시 할 수 있습니까? – Chris

답변

2

한 가지 간단한 방법 :

preg_match_all('/Step(.*?)"end step"/s', $content, $matches); 

이 가장 가까운 "end step"-Step에서 텍스트를 일치합니다. 그러나 느려질 수있는 매 문자마다 역 추적해야합니다.

약간 더 명시 적으로 가능성이 더 효율적 ::

preg_match_all('/Step((?:(?!"end step").)*)/s', $content, $matches); 

Step에서 최대하지만 가까운 "end step"을 포함하지 않는 모든 텍스트를 일치합니다. "end step"이 절대로 나오지 않으면 문자열의 끝까지 일치합니다. 이 정규식은 모든 단계에서 문자열 "end step"이 거기에 일치 할 수 있는지 확인하고 일치하면 종료합니다.

+0

감사합니다! ? * 트릭을 마친 후에! – user410932

+1

@user이 경우'? '가 무엇인지 궁금하다면,'. *'는 덜 탐욕적인 것으로 알려주고, 첫 번째 단계 인 "끝 단계"를 발견하자마자 멈추게됩니다. –

+0

? 수량 기호를 욕심이 아닌 게으른 것으로 만듭니다. 그러나 정교한 방법으로 무엇을하고 있는지, 왜 그것이 더 효율적인지에 대해 자세히 설명합니까? – barsju