2010-02-11 3 views
2

A와 C의 값을 일치시키고 싶지만 단락 내에있는 경우에만 일치시킵니다.정규식 : 단락 내의 건들 일치

A:one 
C:foo 

A:two 
B:rofl, some rubbish ::: 

A:three 
B:lol 
C:bar 

지금 내가

/A:([a-z]*).*?C:([a-z]*)/s 

을 사용하고 있습니다하지만 그건 나에게 함께 속하지 않는 "이"와 "바"를 제공합니다. 내 /.*?/에서 빈 줄을 제외하려면 어떻게합니까?

+0

+1, 나는 단어 'thingies'을 사랑 해요. – Yacoby

답변

2

이중 개행을 금지해야합니다. 엔진에서 미리보기를 허용하는 경우 :

이 기능은 Windows/UNIX 줄 바꿈에서는 작동하지만 Mac에서는 작동하지 않습니다. 또한 A와 C가 줄의 시작 부분에 있는지 확인합니다 (m 수정자를 참고하십시오). (줄 바꿈을 포함하여 제거합니다.)

/A:([a-z]*)\v*.*\v?C:([a-z]*)\v*/m 

기본적으로 줄 바꿈을 활성화 한 다음 특히 당신이 당신의 패턴을 기대하는 줄 바꿈 (\v)을 설명 :

+0

당신이 맞습니다, 코멘트 주셔서 감사합니다. 너는 그것을 가지고있다, +1. – nortron

0

이 나를 위해 작동합니다.

+1

3 개 이상의 줄이 있으면 실패합니다. –

+0

질문에 3 줄 이상은 쓰이지 않습니다. – SoapBox

0
$str=<<<A 
A:one 
C:foo 

A:two 
B:rofl, some rubbish ::: 

A:three 
B:lol 
C:bar 
A; 

$s = explode("\n\n",$str); 
foreach($s as $k){ 
    if(strpos($k,"A:") !==FALSE && strpos($k,"C:") !==FALSE){ 
     $a = array_filter ((preg_split("/([A-Z]):|\n+/sm",$k))); 
     print_r($a); 
    } 
} 

제목의 출력

$ php test.php 
Array 
(
    [1] => one 
    [3] => foo 
) 
Array 
(
    [1] => three 
    [3] => lol 
    [5] => bar 
) 
+0

이것은 내 질문에 대한 대답이 아니지만, 마침내 미리 단락으로 나누는이 방법에 정착했습니다. +1 – blinry